Czy to jest ograniczenie sprawdzania wartości null w języku C #? [duplikować]
Dec 18 2020
Otrzymałem następujące ostrzeżenie CS8629 dotyczące mojego odniesienia do x
. Ze względu na where
klauzulę przed select
, jestem pewien, że x.Value
nigdy nie będzie odwołaniem do wartości null. Czy jest to wewnętrzne ograniczenie sprawdzania wartości null w języku C #? Czy jest inny sposób na pozbycie się ostrzeżenia CS8629 niż jego wyłączenie?
var myEnums = myStrings
.Select(x => x.ToEnum<MyEnum>())
.Where(x => x.HasValue)
.Select(x => x.Value) //CS8629 on x.
.ToList();
MyEnum? ToEnum(this string str);
Odpowiedzi
2 Sweeper Dec 18 2020 at 08:50
Tak, to jest limit. LINQ nie ma jeszcze adnotacji dopuszczających wartość null. Zobacz tę odpowiedź , ten problem i ten problem , które są otwarte.
Jeśli naprawdę nie chcesz używać !
, możesz napisać coś takiego:
static IEnumerable<T> AsEnumerable<T>(this Nullable<T> t) where T : struct {
if (t.HasValue) {
return Enumerable.Repeat(t.Value, 1);
}
return Enumerable.Empty<T>();
}
Następnie użyj SelectMany
:
var myEnums = myStrings
.Select(x => x.ToEnum())
.SelectMany(x => x.AsEnumerable())
.ToList();
UsemeAlehosaini Dec 18 2020 at 08:48
O ile nie będzie powrotu zerowa, spróbuj rzucać MyEnum?
się MyEnum
.
Lubię to:
MyEnum myEnums = myStrings
.Select(x => x.ToEnum<MyEnum>())
.Where(x => x.HasValue)
.Select(x => x.Value) //CS8629 on x.
.ToList();