Інформація про нульовий тип опорного типу, не виявлена ​​в FirstOrDefault


10

Мені хотілося перевірити нову функцію змінних посилальних типів у C # 8.0.

Я запустив новий проект, орієнтований на .NET Core 3.0, включив нульові типи посилань у .csprojфайл та почав кодувати. Я створив простий список, який приймає a 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, зрозуміло, чому : Метод повертає а 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 не надсилає правильне попередження.

Ви можете перевірити подібні проблеми в roslyn repo . Це відкрите питання про Github дуже схоже на вашу проблему. У цьому випуску дописувач пояснює поточну проблему:

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


Щоб додати до цього, ви можете використовувати цей пакет, щоб отримати правильні анотації сьогодні.
canton7

1
Це все ще має місце в .NET Core 3.1. Це робить роботу з змінними типами посилань менш приємною. Я вважаю, що запит на corefx / pull / 40651 виправляє це, але, мабуть, нам доведеться почекати до .NET 5, щоб це зробити :-(
Jeppe Stig Nielsen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.