이것이 C # nullable 검사의 제한입니까? [복제]

Dec 18 2020

.NET에 대한 참조에 대해 다음과 같은 CS8629 경고가 표시되었습니다 x. 때문에의 where전과 절 select, 그 확신 x.Valuenull 허용 기준이 될하지 않습니다. 이것이 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는 아직 nullable 주석으로 주석 처리되지 않았습니다. 이 답변 , 이 문제 및 이 문제를 참조하십시오 .

정말로을 사용하고 싶지 않다면 !다음과 같이 작성할 수 있습니다.

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

더 널 반환이 없을 것 동안, 캐스팅보십시오 MyEnum?MyEnum.

이렇게 :

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