! Operator (null-forgiving) (odwołanie w C#)

Operator jednoargumentowego postfiksu ! to operator typu null-forgiving lub null-suppression. W włączonym kontekście adnotacji dopuszczającej wartość null należy użyć operatora forgiving o wartości null, aby pominąć wszystkie ostrzeżenia dopuszczające wartość null dla poprzedniego wyrażenia. Operator prefiksu ! jednoargumentowego jest operatorem negacji logicznej. Operator forgiving o wartości null nie ma wpływu w czasie wykonywania. Ma to wpływ tylko na statyczną analizę przepływu kompilatora przez zmianę stanu null wyrażenia. W czasie wykonywania wyrażenie x! oblicza wynik wyrażenia bazowego x.

Aby uzyskać więcej informacji na temat funkcji typów odwołań dopuszczanych do wartości null, zobacz Typy referencyjne dopuszczane do wartości null.

Przykłady

Jednym z przypadków użycia operatora forgiving o wartości null jest testowanie logiki weryfikacji argumentu. Rozważmy na przykład następującą klasę:

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

    public string Name { get; }
}

Korzystając z platformy testowej MSTest, możesz utworzyć następujący test dla logiki walidacji w konstruktorze:

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

Bez operatora forgiving o wartości null kompilator generuje następujące ostrzeżenie dla poprzedniego kodu: Warning CS8625: Cannot convert null literal to non-nullable reference type. Korzystając z operatora forgiving o wartości null, należy poinformować kompilator, że przekazywanie null jest oczekiwane i nie powinno być ostrzegane.

Możesz również użyć operatora forgiving o wartości null, gdy na pewno wiesz, że wyrażenie nie może być null , ale kompilator nie potrafi tego rozpoznać. Jeśli w poniższym przykładzie IsValid metoda zwraca truewartość , jej argument nie null jest i można bezpiecznie go wyłuszczyć:

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 operatora forgiving o wartości null kompilator generuje następujące ostrzeżenie dla p.Name kodu: Warning CS8602: Dereference of a possibly null reference.

Jeśli możesz zmodyfikować metodę IsValid , możesz użyć atrybutu NotNullWhen , aby poinformować kompilator, że argument IsValid metody nie może być null , gdy metoda zwraca polecenie 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;

W poprzednim przykładzie nie trzeba używać operatora forgiving o wartości null, ponieważ kompilator ma wystarczającą ilość informacji, aby dowiedzieć się, że p nie może znajdować null się wewnątrz instrukcji if . Aby uzyskać więcej informacji na temat atrybutów, które umożliwiają podanie dodatkowych informacji o stanie null zmiennej, zobacz Uaktualnianie interfejsów API z atrybutami w celu zdefiniowania oczekiwań null.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcję operatora forgiving o wartości null w wersji roboczej specyfikacji typów referencyjnych dopuszczających wartość null.

Zobacz też