Получение различных ссылочных типов, допускающих значение NULL, между синтаксисом запроса LINQ и эквивалентным синтаксисC#

Место общения программистов C#
Anonymous
Получение различных ссылочных типов, допускающих значение NULL, между синтаксисом запроса LINQ и эквивалентным синтаксис

Сообщение Anonymous »

Я использую Visual Studio 2022 (с ReSharper 2024.1, но я не думаю, что это актуально) и разрабатываю в .NET 8. Мой минимальный репродукция такова:

Код: Выделить всё

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;
}
}
Мое понимание стиля синтаксиса запросов LINQ ( ... select) всегда заключалось в том, что это просто «синтаксический сахар» для реальных вызовов методов. Я попросил ReSharper преобразовать первое во второе; но я согласен с тем, что сделано. Я думал, что обе линии будут делать одно и то же. Поэтому я бы ожидал, что querySyntax и MethodSyntax будут иметь один и тот же анализ допустимости значений NULL.
Но это не так.
Компилятор определяет querySyntax как (string, string) , тогда как MethodSyntax идентифицируется как (string?, string?). Это означает, что указанная строка получает предупреждение компилятора CS8602 «Разыменование возможно нулевой ссылки», но эквивалентная строка для querySyntax передается без предупреждения. Естественно, оба варианта с одинаковой вероятностью потерпят неудачу во время выполнения.
Что мне не хватает? Это: ошибка в моих ожиданиях об эквивалентности синтаксиса запроса и синтаксиса метода; ограничение статического анализа обнуляемости компилятора; или что-то еще?

Подробнее здесь: https://stackoverflow.com/questions/788 ... syntax-and

Вернуться в «C#»