Nullable Referenztypinformationen, die nicht aus FirstOrDefault verfügbar gemacht wurden

10

Ich wollte die neue Funktion für nullfähige Referenztypen in C # 8.0 testen .

Ich habe ein neues Projekt für .NET Core 3.0 gestartet, nullfähige Referenztypen in der .csprojDatei aktiviert und mit dem Codieren begonnen. Ich habe eine einfache Liste erstellt, die a nimmt string[]und die stringin diesem Array gleich zurückgibt abc. Da ich nicht sicher bin, ob abcdas Array tatsächlich vorhanden ist, verwende ich dies. Dies FirstOrDefault()sollte standardmäßig verwendet werden, nullwenn keine Übereinstimmung gefunden wird.

using System;
using System.Linq;

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

Meine Methode zurückgibt string, das sollte jetzt die seine Nicht-Nullable - Typ. Da FirstOrDefault()möglicherweise zurückgegeben wird null, würde ich erwarten, dass die obige Methode eine Warnung ausgibt, wenn die Variable null zurückgegeben arg wird. Es tut nicht.

Wenn man sich die Signatur für FirstOrDefault()in Visual Studio ansieht, ist klar, warum : Die Methode gibt a zurück string, nicht das nullbare Äquivalent, das string?ich erwarten würde.

Wenn Sie den folgenden Methodenkörper verwenden, erhalten Sie die erwartete Warnung:

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

System.LinqStellen Systembibliotheken (in diesem Beispiel ) beim Targeting von .NET Core 3.0 wirklich keine Informationen zur Nullbarkeit bereit?

Thorkil Holm-Jacobsen
quelle

Antworten:

9

Sieht so aus, als wäre System.Linqes in der Version 3.0 nicht annullierbar. Nullable Reference Types gibt also nicht die richtige Warnung aus.

Sie können ähnliche Probleme im Roslyn Repo überprüfen . Diese offene Ausgabe auf Github ist Ihrem Problem sehr ähnlich. In dieser Ausgabe erklärt ein Mitwirkender das aktuelle Problem:

System.Linqwird auf NULL festlegbare in kommentierten Master Zweig corefx, aber nicht in Release / 3.0 . Es gibt also nichts Unerwartetes im Compiler. Der Compiler sollte einige Diagnosen bereitstellen, aus denen hervorgeht, dass Sie nullable-ahnungsloses Material verwenden.

Piraces
quelle
Um dies hinzuzufügen, können Sie dieses Paket verwenden , um noch heute die richtigen Anmerkungen zu erhalten.
canton7
1
Dies ist in .NET Core 3.1 immer noch der Fall. Es macht das Arbeiten mit nullbaren Referenztypen weniger schön. Ich glaube, die Pull-Anfrage corefx / pull / 40651 behebt dies, aber anscheinend müssen wir bis .NET 5 warten , um das zu bekommen :-(
Jeppe Stig Nielsen