! (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.