Обнуляемая информация о ссылочном типе, не предоставленная FirstOrDefault

10

Я хотел протестировать новую возможность ссылочных типов обнуляемого в 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, я ожидал бы, что вышеупомянутый метод выдаст предупреждение при возврате значения возможно нулевой arg . Это не.

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

Использование тела метода ниже дает предупреждение, которое я ожидал:

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

Разве системные библиотеки (в этом примере System.Linq) действительно не предоставляют информацию об обнуляемости при нацеливании на .NET Core 3.0?

Торкил Холм-Якобсен
источник

Ответы:

9

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

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

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

Пирасес
источник
Чтобы добавить к этому, вы можете использовать этот пакет, чтобы получить правильные аннотации сегодня.
canton7
1
Это все еще имеет место в .NET Core 3.1. Это делает работу с обнуляемыми ссылочными типами менее приятной. Я полагаю, что запрос на загрузку corefx / pull / 40651 исправляет это, но, очевидно, нам придется подождать до .NET 5, чтобы получить это :-(
Jeppe Stig Nielsen