¿Es esta la limitación de la comprobación que acepta valores NULL de C #? [duplicar]

Dec 18 2020

He recibido la siguiente advertencia de CS8629 en mi referencia a x. Debido a la wherecláusula antes de select, estoy seguro de que x.Valuenunca será una referencia anulable. ¿Es esta la limitación intrínseca de la comprobación nula de C #? ¿Hay alguna forma de deshacerse de la advertencia CS8629 además de suprimirla?

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);

Respuestas

2 Sweeper Dec 18 2020 at 08:50

Sí, este es el límite. LINQ todavía no está anotado con anotaciones que aceptan valores NULL. Vea esta respuesta , este problema y este problema , que están todos abiertos.

Si realmente no quiere usar !, puede escribir algo como:

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>();
}

Entonces usa SelectMany:

var myEnums = myStrings
      .Select(x => x.ToEnum())
      .SelectMany(x => x.AsEnumerable())
      .ToList();
UsemeAlehosaini Dec 18 2020 at 08:48

Si bien no habrá un retorno nulo, intente lanzar el MyEnum?to MyEnum.

Como esto:

MyEnum myEnums = myStrings
      .Select(x => x.ToEnum<MyEnum>())
      .Where(x => x.HasValue)
      .Select(x => x.Value)  //CS8629 on x.
      .ToList();