Apakah ini batasan pemeriksaan C # nullable? [duplikat]
Saya mendapat peringatan CS8629 berikut tentang referensi saya ke x
. Karena where
klausa sebelum select
, saya yakin itu x.Value
tidak akan pernah menjadi referensi yang dapat dibatalkan. Apakah ini batasan intrinsik dari pemeriksaan C # null? Apakah ada cara untuk menghilangkan peringatan CS8629 selain menekannya?
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);
Jawaban
2 Sweeper
Ya, ini batasnya. LINQ belum dianotasi dengan anotasi nullable. Lihat jawaban ini , masalah ini dan masalah ini , yang semuanya terbuka.
Jika Anda benar-benar tidak ingin menggunakan !
, Anda dapat menulis sesuatu seperti:
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>();
}
Kemudian gunakan SelectMany
:
var myEnums = myStrings
.Select(x => x.ToEnum())
.SelectMany(x => x.AsEnumerable())
.ToList();
UsemeAlehosaini
Meskipun tidak akan ada pengembalian nol, Coba lemparkan MyEnum?
ke MyEnum
.
Seperti ini:
MyEnum myEnums = myStrings
.Select(x => x.ToEnum<MyEnum>())
.Where(x => x.HasValue)
.Select(x => x.Value) //CS8629 on x.
.ToList();
Selalu Menjadi Ancaman: Mengapa Orang Berkulit Coklat dan Hitam Tidak Bisa Nyaman di Amerika Serikat