Considere o seguinte código:
#nullable enable
class Foo
{
public string? Name { get; set; }
public bool HasName => Name != null;
public void NameToUpperCase()
{
if (HasName)
{
Name = Name.ToUpper();
}
}
}
No Name = Name.ToUpper (), recebo um aviso de que Name é uma possível referência nula, o que está claramente incorreto. Eu posso curar esse aviso inserindo HasName para que a condição seja if (Name! = Null).
Existe alguma maneira de instruir o compilador que uma resposta verdadeira de HasName implica uma restrição de não anulabilidade em Name?
Isso é importante porque o HasName pode realmente testar muito mais coisas, e eu posso querer usá-lo em vários locais, ou pode ser uma parte pública da superfície da API. Há muitas razões para querer incluir o cheque nulo em seu próprio método, mas fazer isso parece interromper o verificador de referência anulável.
c#
nullable-reference-types
John Melville
fonte
fonte
HasValue
em um tipo anulável, não compará-lonull
. Provavelmente não afeta o seu problema.#nullable disable
posteriormente#nullable enable
ourestore
novamente ( docs.microsoft.com/en-us/dotnet/csharp/… ).!
operador "dammit" .if(HasName) { Name = Name!.ToUpper(); }
Respostas:
Olhei em volta para os diferentes atributos
System.Diagnostics.CodeAnalysis
e não consegui encontrar nada aplicável, o que é muito decepcionante. O mais próximo possível do que você deseja parece ser:Parece bem complicado, eu sei. Você pode procurar nos documentos do MSDN atributos anuláveis , talvez encontre algo mais arrumado.
fonte
if(Name != null) return Null.ToUpper()
, não haverá aviso para uma desreferência nula, embora tecnicamente seja uma condição de corrida TOCTOU. Lembro-me de Mads Torgersen falando sobre como eles consideraram isso, mas geraria tantos falsos positivos que todo o recurso de tipos de referência nulizáveis seria efetivamente inútil - 99% do tempo em que suas propriedades não serão alteradas por outro segmento. Portanto, tudo que você precisa fazer é criar um atributo que faça com que a verificação nesta propriedade seja tratada como uma verificação de nulo em outra propriedade.String é um tipo de referência e anulável (por exemplo
int?
) são tipos de valores anuláveis. Então você não pode realmente fazer issostring? myString
; O que você precisa é este:fonte