これは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();