Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.