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 whereklauzulę przed select, jestem pewien, że x.Valuenigdy 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();