! (null-forgiving) – operátor (referenční příručka jazyka C#)

V jazyce C# 8.0 a novějším je unární příponový operátor operátorem, který uchová hodnotu null nebo potlačení ! hodnoty null. V povoleném kontextupoznámek s možnou hodnotou null můžete pomocí operátoru null-forgiving deklarovat, že výraz typu odkazu x není : null x! . Unární operátor ! předpony je logický operátor negace.

Operátor null-forgiving nemá v době běhu žádný vliv. Ovlivňuje pouze analýzu statického toku kompilátoru změnou stavu null výrazu. Za běhu se výraz x! vyhodnotí jako výsledek podkladového výrazu x .

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

Příklady

Jedním z případů použití operátoru pro odpouštění hodnot null je testování logiky ověřování argumentů. 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 MSTestmůžete v konstruktoru vytvořit následující test logiky ověřování:

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

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

Operátor null-forgiving můžete použít také v případě, že víte, že výraz nemůže být, ale kompilátor ho nedokáže null rozpoznat. Pokud metoda v následujícím příkladu vrátí hodnotu , její argument není a můžete k ní IsValid true bezpečně null přeskakovat:

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 vygeneruje kompilátor pro kód následující p.Name upozornění: Warning CS8602: Dereference of a possibly null reference .

Pokud můžete upravit metodu , můžete použít atribut IsValid NotNullWhen a informovat kompilátor, že argument metody nemůže být, když IsValid metoda vrátí null 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 není nutné používat operátor null-forgiving, protože kompilátor má dostatek informací k tomu, aby zjistil, že nemůže být uvnitř p null příkazu if . Další informace o atributech, které umožňují zadat další informace o stavu null proměnné, najdete v tématu Upgrade rozhraní API s atributy pro definování nulových očekávání.

specifikace jazyka C#

Další informace najdete v části Operátor null-forgiving v konceptu specifikace odkazových typů s možnou hodnotou null.

Viz také