Bu, C # null yapılabilir denetimin sınırlaması mı? [çiftleme]

Dec 18 2020

Referansımda aşağıdaki CS8629 uyarısını aldım x. 'Den önceki wherecümle nedeniyle, bunun asla boş değer atanabilir bir referans olmayacağına selecteminim x.Value. Bu, C # boş kontrolünün içsel sınırlaması mıdır? CS8629 uyarısından kurtulmanın, onu bastırmaktan başka bir yolu var mı?

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

Yanıtlar

2 Sweeper Dec 18 2020 at 08:50

Evet, sınır budur. LINQ, henüz null yapılabilir ek açıklamalarla açıklanmadı. Bu yanıtı , bu sorunu ve hepsi açık olan bu sorunu görün .

Gerçekten kullanmak istemiyorsan şöyle bir !şey yazabilirsin:

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

Ardından şunu kullanın SelectMany:

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

Hiçbir boş geri dönüşü olacak olsa da, döküm deneyin MyEnum?için MyEnum.

Böyle:

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