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 whereKlausel vor dem selectbin ich sicher, dass dies x.Valueniemals 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();