Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Унарный оператор постфикса ! — это оператор null-forgiving, или null-подавление. В контексте заметки с включенным значением NULL используйте оператор null-forgiving для подавления всех предупреждений, допускающих значение NULL для предыдущего выражения. Унарный префиксный оператор ! является оператором логического отрицания. Оператор, допускающий NULL, ни на что не влияет во время выполнения. Он влияет только на статический анализ потока компилятора путем изменения состояния NULL выражения. Во время выполнения выражение x! сравнивается с результатом базового выражения x.
Дополнительные сведения о ссылочных типах, допускающих значения NULL, см. в разделе Ссылочные типы, допускающие значение NULL.
Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.
Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.
Подсказка
Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.
Примеры
Одним из вариантов использования для оператора, допускающего значение NULL, является проверка логики проверки аргументов. Например, рассмотрим следующий класс.
#nullable enable
public class Person
{
public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name));
public string Name { get; }
}
С помощью платформы тестирования MSTest можно создать следующий тест для логики проверки в конструкторе:
[TestMethod, ExpectedException(typeof(ArgumentNullException))]
public void NullNameShouldThrowTest()
{
var person = new Person(null!);
}
Без оператора, допускающего значение NULL, компилятор создает следующее предупреждение для предыдущего кода: Warning CS8625: Cannot convert null literal to non-nullable reference type. Используя оператор с прощения null, вы сообщаете компилятору, что ожидается передача null и не должна создавать предупреждение.
Вы также можете использовать оператор с прощения null, если вы определенно знаете, что выражение не может быть null , но компилятор не распознает это. В следующем примере, если метод IsValid возвращает true, его аргумент не является null, и его можно безопасно разыменовать:
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;
Без оператора, допускающего значение NULL, компилятор создает следующее предупреждение для кода p.Name: Warning CS8602: Dereference of a possibly null reference.
Если вы можете изменить метод IsValid, можно использовать атрибут NotNullWhen для указания компилятору, что аргумент метода IsValid не может быть 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;
В предыдущем примере не требуется использовать оператор, прощающий null, так как компилятор имеет достаточно сведений, чтобы определить, что p не может находиться null внутри инструкции if. См. сведения об атрибутах, позволяющих указать дополнительную информацию о состоянии NULL для переменной, в руководстве по включению в API атрибутов для определения ожидаемых значений NULL.
Спецификация языка C#
Для получения дополнительной информации, см. раздел об операторе, допускающем значение NULL в черновике спецификации ссылочных типов, допускающих значение NULL.