! (null-forgiving) – operátor (referenční dokumentace jazyka C#)

Unární operátor přípony ! je operátor null-forgiving nebo potlačení null. V povoleném kontextu poznámek s možnou hodnotou null použijete operátor null-forgiving k potlačení všech upozornění s možnou hodnotou null pro předchozí výraz. Operátor unární předpony ! je logický operátor negace. Operátor pro odgiving s hodnotou null nemá v době běhu žádný vliv. Ovlivňuje pouze statickou analýzu toku kompilátoru změnou stavu null výrazu. Za běhu výraz x! vyhodnotí výsledek podkladového výrazu x.

Další informace o funkci odkazových typů s možnou hodnotou null naleznete v tématu Odkazové typy s možnou hodnotou Null.

Příklady

Jedním z případů použití operátoru null-forgiving je testování logiky ověření argumentu. Představte si například následující třídu:

#nullable enable
public class Person
{
    public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name));

    public string Name { get; }
}

Pomocí testovací architektury MSTest můžete vytvořit následující test logiky ověřování v konstruktoru:

[TestMethod, ExpectedException(typeof(ArgumentNullException))]
public void NullNameShouldThrowTest()
{
    var person = new Person(null!);
}

Bez operátoru null-forgiving kompilátor vygeneruje následující upozornění pro předchozí kód: Warning CS8625: Cannot convert null literal to non-nullable reference type. Pomocí operátoru null-forgiving informujete kompilátor, že předávání null je očekávané a nemělo by být varováno.

Operátor null-forgiving můžete také použít, když určitě víte, že výraz nemůže být null , ale kompilátor ho nedokáže rozpoznat. V následujícím příkladu IsValid , pokud metoda vrátí true, jeho argument není null a můžete bezpečně dereferovat ji:

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;

Bez operátoru null-forgiving kompilátor vygeneruje následující upozornění pro p.Name kód: Warning CS8602: Dereference of a possibly null reference.

Pokud můžete změnit metodu IsValid , můžete použít NotNullWhen atribut informovat kompilátor, že argument IsValid metody nemůže být null , když metoda vrátí true:

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;

V předchozím příkladu nemusíte používat operátor null-forgiving, protože kompilátor má dostatek informací, aby zjistil, že p nemůže být null uvnitř if příkazu. Další informace o atributech, které umožňují poskytnout další informace o stavu null proměnné, naleznete v tématu Upgrade ROZHRANÍ API s atributy definující očekávání null.

specifikace jazyka C#

Další informace naleznete v části operátorunull-progiving konceptu specifikace referenčních typů s možnou hodnotou null.

Viz také