Apakah ini batasan pemeriksaan C # nullable? [duplikat]

Dec 18 2020

Saya mendapat peringatan CS8629 berikut tentang referensi saya ke x. Karena whereklausa sebelum select, saya yakin itu x.Valuetidak 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 Dec 18 2020 at 08:50

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 Dec 18 2020 at 08:48

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