Considere el siguiente código:
#nullable enable
class Foo
{
public string? Name { get; set; }
public bool HasName => Name != null;
public void NameToUpperCase()
{
if (HasName)
{
Name = Name.ToUpper();
}
}
}
En Name = Name.ToUpper () recibo una advertencia de que Name es una posible referencia nula, que es claramente incorrecta. Puedo curar esta advertencia al incluir HasName para que la condición sea if (Name! = Null).
¿Hay alguna forma de indicarle al compilador que una respuesta verdadera de HasName implica una restricción de nulabilidad en Name?
Esto es importante porque HasName en realidad podría probar muchas más cosas, y podría querer usarlo en varios lugares, o podría ser una parte pública de la superficie API. Hay muchas razones para querer incluir la verificación nula en su propio método, pero hacerlo parece romper el verificador de referencia anulable.
c#
nullable-reference-types
John Melville
fuente
fuente
HasValue
en un tipo anulable, no verificarlonull
. Sin embargo, probablemente no afecte tu problema.#nullable disable
luego#nullable enable
orestore
nuevamente ( docs.microsoft.com/en-us/dotnet/csharp/… ).!
operador "maldita sea" .if(HasName) { Name = Name!.ToUpper(); }
Respuestas:
Observé los diferentes atributos
System.Diagnostics.CodeAnalysis
y no pude encontrar nada aplicable, lo cual es muy decepcionante. Lo más cercano que puede llegar a lo que quiere parece ser:Parece bastante engorroso, lo sé. Puede buscar en los documentos de MSDN atributos anulables , tal vez encuentre algo más ordenado.
fuente
if(Name != null) return Null.ToUpper()
, no habrá advertencia para una desreferencia nula, aunque técnicamente es una condición de carrera TOCTOU. Recuerdo que Mads Torgersen habló sobre cómo consideraron eso, pero generaría tantos falsos positivos que toda la característica de tipos de referencia anulables sería efectivamente inútil: el 99% del tiempo sus propiedades no serán cambiadas por otro hilo. Entonces, todo lo que necesita hacer es hacer un atributo que haga que el cheque de esta propiedad sea tratado como un cheque nulo en otra propiedad.La cadena es un tipo de referencia y anulable (p
int?
. Ej. ) Son tipos de valores anulables. Entonces realmente no puedes hacer estostring? myString
; Lo que necesitas es esto:fuente