Informacje o typie odwołania do wartości zerowej nie zostały ujawnione przez FirstOrDefault

10

Chciałem przetestować nową funkcję zerowania typów odwołań w C # 8.0.

Rozpocząłem nowy projekt ukierunkowany na .NET Core 3.0, włączyłem typy zerowalne w .csprojpliku i zacząłem kodować. Utworzyłem prostą listę, która bierze a string[]i zwraca stringw tej tablicy, która jest równa abc. Teraz, ponieważ nie jestem pewien, czy abcrzeczywiście istnieje w tablicy, używam FirstOrDefault(), która powinna być domyślnie nullustawiona, jeśli nie zostanie znalezione dopasowanie.

using System;
using System.Linq;

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

Zwraca moją metodę string, która powinna być teraz typem niezerowalnym . Ponieważ FirstOrDefault()może się zwrócić null, oczekiwałbym, że powyższa metoda wyświetli ostrzeżenie przy zwróceniu zmiennej może być zerowej arg . To nie.

Patrząc na podpis FirstOrDefault()w Visual Studio, jasne jest, dlaczego : Metoda zwraca a stringnie dopuszczalny zerowy odpowiednik, string?którego bym się spodziewał.

Użycie poniższej metody metody daje oczekiwane ostrzeżenie:

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

Czy biblioteki systemowe (w tym przykładzie System.Linq) tak naprawdę nie ujawniają informacji o wartości dopuszczalnej podczas celowania w .NET Core 3.0?

Thorkil Holm-Jacobsen
źródło

Odpowiedzi:

9

Wygląda na System.Linqto, że nie ma null adnotacji w wersji 3.0. Zatem zerowe typy referencyjne nie emitują poprawnego ostrzeżenia.

Podobne problemy możesz sprawdzić w repozytorium Roslyn . Ten otwarty problem w Github jest bardzo podobny do twojego problemu. W tym wydaniu autor wyjaśnia bieżący problem:

System.Linqjest nullable w głównej gałęzi corefx, ale nie w wersji / 3.0 . Więc w kompilatorze nie ma nic nieoczekiwanego. Kompilator powinien udostępnić diagnostykę pokazującą, że używasz rzeczy niepozostawiających wartości zerowych.

piraci
źródło
Aby dodać do tego, możesz użyć tego pakietu, aby uzyskać odpowiednie adnotacje już dziś.
kanton7
1
Tak jest nadal w przypadku .NET Core 3.1. To sprawia, że ​​praca z zerowymi typami referencyjnymi jest mniej przyjemna. Wierzę, że żądanie ściągnięcia corefx / pull / 40651 to rozwiązuje, ale najwyraźniej będziemy musieli poczekać do .NET 5, aby to uzyskać :-(
Jeppe Stig Nielsen