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?

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.