Ist dies die Einschränkung der C # -Nullable-Prüfung? [Duplikat]
Dec 18 2020
Ich habe die folgende CS8629-Warnung in meinem Verweis auf erhalten x
. Aufgrund der where
Klausel vor dem select
bin ich sicher, dass dies x.Value
niemals eine nullbare Referenz sein wird. Ist dies die eigentliche Einschränkung der C # -Nullprüfung? Gibt es eine andere Möglichkeit, die CS8629-Warnung zu entfernen, als sie zu unterdrücken?
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);
Antworten
2 Sweeper Dec 18 2020 at 08:50
Ja, das ist die Grenze. LINQ ist noch nicht mit nullbaren Annotationen versehen. Siehe diese Antwort , dieses Problem und dieses Problem , die alle offen sind.
Wenn Sie wirklich nicht verwenden möchten !
, können Sie etwas schreiben wie:
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>();
}
Dann benutze SelectMany
:
var myEnums = myStrings
.Select(x => x.ToEnum())
.SelectMany(x => x.AsEnumerable())
.ToList();
UsemeAlehosaini Dec 18 2020 at 08:48
Während es keine Null-Rückgabe gibt, versuchen Sie, das MyEnum?
zu übertragen MyEnum
.
So was:
MyEnum myEnums = myStrings
.Select(x => x.ToEnum<MyEnum>())
.Where(x => x.HasValue)
.Select(x => x.Value) //CS8629 on x.
.ToList();