Код: Выделить всё
public class Program
{
public static void Main()
{
string? ANullableString()
{
return Random.Shared.Next(10) % 2 == 0 ? null : "Panda";
}
var querySyntax =
(from i in Enumerable.Range(1, 4)
select (ANullableString(), ANullableString()))
.First();
var methodSyntax =
(Enumerable.Range(1, 4)
.Select(i => (ANullableString(), ANullableString())))
.First();
// No warnings
var querySyntaxItem1Length = querySyntax.Item1.Length;
// Warning CS8602
var methodSyntaxItem1Length = methodSyntax.Item1.Length;
}
}
Код: Выделить всё
from
Но это не так.
Компилятор определяет querySyntax как (string, string) , тогда как MethodSyntax идентифицируется как (string?, string?). Это означает, что указанная строка получает предупреждение компилятора CS8602 «Разыменование возможно нулевой ссылки», но эквивалентная строка для querySyntax передается без предупреждения. Естественно, оба варианта с одинаковой вероятностью потерпят неудачу во время выполнения.
Что мне не хватает? Это: ошибка в моих ожиданиях об эквивалентности синтаксиса запроса и синтаксиса метода; ограничение статического анализа обнуляемости компилятора; или что-то еще?
Подробнее здесь: https://stackoverflow.com/questions/788 ... syntax-and