Betrachten Sie den folgenden Code:
#nullable enable
class Foo
{
public string? Name { get; set; }
public bool HasName => Name != null;
public void NameToUpperCase()
{
if (HasName)
{
Name = Name.ToUpper();
}
}
}
Auf dem Namen = Name.ToUpper () erhalte ich eine Warnung, dass Name eine mögliche Nullreferenz ist, was eindeutig falsch ist. Ich kann diese Warnung beheben, indem ich HasName einfüge, sodass die Bedingung if (Name! = Null) lautet.
Kann ich den Compiler auf irgendeine Weise anweisen, dass eine echte Antwort von HasName eine Nicht-Nullfähigkeitsbeschränkung für Name impliziert?
Dies ist wichtig, da HasName möglicherweise viel mehr Dinge testet und ich es möglicherweise an mehreren Stellen verwenden möchte oder es ein öffentlicher Teil der API-Oberfläche ist. Es gibt viele Gründe, die Nullprüfung in ihre eigene Methode einbeziehen zu wollen, aber dies scheint die nullbare Referenzprüfung zu beschädigen.
c#
nullable-reference-types
John Melville
quelle
quelle
HasValue
für einen nullbaren Typ verwenden, nicht dagegen prüfennull
. Es hat jedoch wahrscheinlich keinen Einfluss auf Ihr Problem.#nullable disable
dann#nullable enable
oderrestore
danach erneut umschließen ( docs.microsoft.com/en-us/dotnet/csharp/… ).!
Operator "verdammt" verwenden .if(HasName) { Name = Name!.ToUpper(); }
Antworten:
Ich habe mich in den verschiedenen Attributen umgesehen
System.Diagnostics.CodeAnalysis
und konnte nichts zutreffendes finden, was sehr enttäuschend ist. Der nächste Punkt, den Sie erreichen können, scheint zu sein:Es sieht ziemlich umständlich aus, ich weiß. Sie können in den MSDN-Dokumenten nach nullbaren Attributen suchen. Vielleicht finden Sie etwas Ordentlicheres.
quelle
if(Name != null) return Null.ToUpper()
, wird keine Warnung für eine Null-Dereferenzierung angezeigt, obwohl es sich technisch gesehen um eine TOCTOU-Rennbedingung handelt. Ich erinnere mich, dass Mads Torgersen darüber sprach, wie sie das betrachteten, aber es würde so viele Fehlalarme erzeugen, dass die gesamte Funktion für nullfähige Referenztypen praktisch nutzlos wäre - 99% der Zeit werden Ihre Eigenschaften nicht von einem anderen Thread geändert. Sie müssen also nur ein Attribut erstellen, mit dem die Prüfung dieser Eigenschaft als Prüfung einer anderen Eigenschaft auf Null behandelt wird.String ist ein Referenztyp und nullable (z. B.
int?
) ist nullable Werttypen. Das kann man also nicht wirklich machenstring? myString
; Was Sie brauchen, ist Folgendes:quelle