Nota
L'accés a aquesta pàgina requereix autorització. Pots provar d'iniciar sessió o canviar de directori.
L'accés a aquesta pàgina requereix autorització. Pots provar de canviar directoris.
El operador ! de postfijo unario es el operador que permite los valores NULL o la supresión de valores NULL. En un contexto de anotación que acepta valores NULL habilitado, use el operador null-forgiving para suprimir todas las advertencias que aceptan valores NULL para la expresión anterior. El operador ! de prefijo unario es el operador lógico de negación. El operador que permite un valor NULL no tiene ningún efecto en tiempo de ejecución. Solo afecta al análisis de flujo estático del compilador al cambiar el estado NULL de la expresión. En tiempo de ejecución, la expresión x! se evalúa en el resultado de la expresión subyacente x.
Para obtener más información sobre la característica de tipos de referencia que admiten un valor NULL, consulte Tipos de referencia que admiten un valor NULL.
La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.
La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.
Sugerencia
Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.
Ejemplos
Un caso de uso para el operador null-forgiving es probar la lógica de validación de argumentos. Por ejemplo, considere la siguiente clase:
#nullable enable
public class Person
{
public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name));
public string Name { get; }
}
Mediante el marco de pruebas de MSTest, puede crear la siguiente prueba para la lógica de validación en el constructor:
[TestMethod, ExpectedException(typeof(ArgumentNullException))]
public void NullNameShouldThrowTest()
{
var person = new Person(null!);
}
Sin el operador que permite un valor NULL, el compilador genera la advertencia siguiente para el código anterior: Warning CS8625: Cannot convert null literal to non-nullable reference type. Al usar el operador null-forgiving, se informa al compilador de que se espera que pase null y no debe generar una advertencia.
También puede usar el operador null-forgiving cuando sepa definitivamente que una expresión no puede ser null , pero el compilador no reconoce eso. En el ejemplo siguiente, si el método IsValid devuelve true, su argumento no es null y puede desreferenciarlo de forma segura:
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;
Sin el operador que permite un valor NULL, el compilador genera la advertencia siguiente para el código p.Name: Warning CS8602: Dereference of a possibly null reference.
Si puede modificar el método IsValid, puede usar el atributo NotNullWhen para notificar al compilador que un argumento del método IsValid no puede ser null cuando el método devuelve 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;
En el ejemplo anterior, no es necesario usar el operador que permite un valor NULL porque el compilador tiene suficiente información para averiguar que p no puede ser null en la instrucción if. Para más información sobre los atributos que permiten proporcionar información adicional sobre el estado NULL de una variable, vea Actualización de las API con atributos para definir las expectativas NULL.
Especificación del lenguaje C#
Para obtener más información, consulte la sección The null-forgiving operator (El operador que admite valores NULL) del borrador de la especificación de tipos de referencia que aceptan valores NULL.