Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der unäre Postfixoperator ! ist der NULL-tolerante bzw. NULL-Unterdrückungs-Operator. Verwenden Sie in einem aktivierten nullablen Anmerkungskontext den Operator "null-verzeihen", um alle nullablen Warnungen für den vorherigen Ausdruck zu unterdrücken. Der unäre Präfixoperator ! ist der Operator für logische Negation. Der NULL-tolerante Operator besitzt zur Laufzeit keine Auswirkungen. Er wirkt sich nur auf die statische Flussanalyse des Compilers aus, indem der NULL-Status des Ausdrucks geändert wird. Zur Laufzeit wird Ausdruck x! in das Ergebnis des zugrunde liegenden Ausdrucks x ausgewertet.
Weitere Informationen zum Feature „Nullable-Verweistypen“ finden Sie unter Nullable-Verweistypen.
Die C#-Sprachreferenz dokumentiert die zuletzt veröffentlichte Version der C#-Sprache. Außerdem enthält sie eine erste Dokumentation zu Funktionen in der öffentlichen Vorschau für die kommende Sprachversion.
In der Dokumentation werden alle Features identifiziert, die in den letzten drei Versionen der Sprache oder in der aktuellen öffentlichen Vorschau eingeführt wurden.
Tipp
Informationen dazu, wann ein Feature erstmals in C# eingeführt wurde, finden Sie im Artikel zum Versionsverlauf der C#-Sprache.
Beispiele
Ein Anwendungsfall für den Operator null-verzeihend ist das Testen der Argumentüberprüfungslogik. Betrachten Sie beispielsweise die folgende Klasse:
#nullable enable
public class Person
{
public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name));
public string Name { get; }
}
Mithilfe des MSTest-Testframeworks können Sie den folgenden Test für die Validierungslogik im Konstruktor erstellen:
[TestMethod, ExpectedException(typeof(ArgumentNullException))]
public void NullNameShouldThrowTest()
{
var person = new Person(null!);
}
Ohne den NULL-toleranten Operator generiert der Compiler die folgende Warnung für den oben gezeigten Code: Warning CS8625: Cannot convert null literal to non-nullable reference type. Mit dem Operator "null-forgiving" informieren Sie den Compiler darüber, dass die Übergabe null erwartet wird und keine Warnung generiert werden sollte.
Sie können auch den Operator null-verzeihen, wenn Sie definitiv wissen, dass ein Ausdruck nicht sein null kann, aber der Compiler erkennt das nicht. Wenn die IsValid-Methode im folgenden Beispiel true zurückgibt, ist das Argument nicht null, und Sie können es sicher dereferenzieren:
public static void Main()
{
Person? p = Find("John");
if (IsValid(p))
{
Console.WriteLine($"Found {p!.Name}");
}
}
public static bool IsValid(Person? person)
=> person is not null && person.Name is not null;
Ohne den NULL-toleranten Operator generiert der Compiler die folgende Warnung für den p.Name-Code: Warning CS8602: Dereference of a possibly null reference.
Wenn Sie die IsValid-Methode ändern können, können Sie das NotNullWhen-Attribut verwenden, um den Compiler darüber zu informieren, dass ein Argument der IsValid-Methode nicht null sein kann, wenn die Methode true zurückgibt:
public static void Main()
{
Person? p = Find("John");
if (IsValid(p))
{
Console.WriteLine($"Found {p.Name}");
}
}
public static bool IsValid([NotNullWhen(true)] Person? person)
=> person is not null && person.Name is not null;
Im vorherigen Beispiel müssen Sie den NULL-toleranten Operator nicht verwenden, da der Compiler über genügend Informationen verfügt, um zu ermitteln, dass p in der null-Anweisung nicht if sein kann. Weitere Informationen zu den Attributen, mit denen Sie zusätzliche Informationen zum NULL-Status einer Variablen bereitstellen können, finden Sie unter Aktualisieren von APIs mit Attributen zum Definieren von NULL-Erwartungen.
C#-Sprachspezifikation
Weitere Informationen finden Sie im Abschnitt Der NULL-tolerante Operator des Entwurfs der Spezifikation von Nullable-Verweistypen.