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