Получение различных ссылочных типов, допускающих значение 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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