これはC#のnull許容チェックの制限ですか?[複製]

Dec 18 2020

への参照に関して、次のCS8629警告がありましたx。のwhere前の句があるため、これがnull許容の参照になることはないとselect確信していx.Valueます。これはC#nullチェックの本質的な制限ですか?CS8629の警告を抑制する以外に、警告を取り除く方法はありますか?

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

回答

2 Sweeper Dec 18 2020 at 08:50

はい、これが限界です。LINQには、まだnull許容の注釈が付けられていません。この回答、この問題、およびこの問題を参照してください。これらはすべて未解決です。

本当に使いたくない場合は!、次のように書くことができます。

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

次に、以下を使用しますSelectMany

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

nullリターンはありませんが、MyEnum?をにキャストしてみてくださいMyEnum

このような:

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