Est-ce la limitation de la vérification Nullable C #? [dupliquer]

Dec 18 2020

J'ai eu l'avertissement CS8629 suivant sur ma référence à x. En raison de la whereclause précédant le select, je suis sûr que x.Valuece ne sera jamais une référence nullable. Est-ce la limitation intrinsèque de la vérification Null C #? Existe-t-il un moyen de se débarrasser de l'avertissement CS8629 autre que de le supprimer?

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

Réponses

2 Sweeper Dec 18 2020 at 08:50

Oui, c'est la limite. LINQ n'est pas encore annoté avec des annotations nullables. Voir cette réponse , ce problème et ce problème , qui sont tous ouverts.

Si vous ne voulez vraiment pas utiliser !, vous pouvez écrire quelque chose comme:

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

Ensuite, utilisez SelectMany:

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

Bien qu'il n'y ait pas de retour nul, essayez de lancer le MyEnum?vers MyEnum.

Comme ça:

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