Обнуляемая информация о ссылочном типе, не предоставленная FirstOrDefault - PullRequest
1 голос
/ 02 ноября 2019

Я хотел протестировать новую функцию Обнуляемые ссылочные типы в C # 8.0.

Я начал новый проект, ориентированный на .NET Core 3.0, включил обнуляемые ссылочные типы в .csproj иначал кодировать. Я создал простой список, который принимает string[] и возвращает string в этом массиве, равный "abc". Теперь, так как я не уверен, что "abc" действительно существует в массиве, я использую FirstOrDefault(), который по умолчанию должен быть null, если совпадение не найдено.

using System;
using System.Linq;

public string FindArgument(string[] args)
{
    var arg = args.FirstOrDefault(x => x == "abc");
    return arg;
}

Мой метод возвращает string который теперь должен быть не обнуляемый тип. Поскольку FirstOrDefault может возвращать null, я ожидаю, что приведенный выше метод выдаст предупреждение при возврате переменной возможно null arg. Это не так.

Глядя на подпись для FirstOrDefault в Visual Studio , становится понятно, почему : метод возвращает string, а не эквивалентный Nullable string? Я быОжидайте.

Использование тела метода, приведенного ниже, дает ожидаемое мной предупреждение.

var arg = args.Contains("abc") ? "abc" : null;
return arg;

Системные библиотеки (в этом примере System.Linq) действительно не предоставляют информацию об обнуляемости при нацеливании на .NET Core3,0

1 Ответ

1 голос
/ 02 ноября 2019

Похоже, что System.Linq не аннулируется аннулированием в версии 3.0. Поэтому Nullable Reference Types не выдает правильное предупреждение.

Подобные проблемы вы можете проверить в roslyn repo . Этот открытый вопрос на Github очень похож на вашу проблему. В этом выпуске автор объясняет текущую проблему:

System.Linq аннулируется аннулированием в master ветви corefx, но не в release / 3.0 . Так что в компиляторе нет ничего неожиданного. Компилятор должен предоставить некоторую диагностику, показывающую, что вы используете обнуляемую информацию, которую можно обнулять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...