Aparentemente Nullable<int>
e int?
são equivalentes em valor. Existe alguma razão para escolher um em vez do outro?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
Sem diferença.
int?
é apenas uma abreviatura de Nullable<int>
, que em si é uma abreviatura de Nullable<Int32>
.
O código compilado será exatamente o mesmo que você escolher usar.
O
?
formulário é apenas uma abreviação para o tipo completo. A preferência pessoal é a única razão para escolher um em vez do outro.Detalhes completos aqui .
fonte
Embora concorde plenamente que na maioria dos casos eles são o mesmo, recentemente deparei com uma situação, quando não é a diferença entre os dois. Para os detalhes sangrentos, consulte esta pergunta , mas para dar um exemplo rápido aqui:
A primeira linha fornece as seguintes mensagens de erro:
Se você está curioso sobre o motivo exato para isso, eu realmente recomendo que você verifique a questão já vinculada , mas o problema básico é que na fase de análise após um
is
(ou umas
) operador, quando nos deparamos com um?
token, verificamos se o próximo token pode ser interpretado como um operador unário (&
poderia ser um) e se assim for: o analisador não se preocupa com a possibilidade de o?
token ser um modificador de tipo, ele simplesmente usa o tipo antes dele e irá analisar o resto como se o?
token era um operador ternário (portanto, a análise falhará).Portanto, embora em geral
int?
eNullable<int>
sejam intercambiáveis, existem alguns casos extremos em que eles produzem resultados completamente diferentes, devido à forma como o analisador vê seu código.fonte
test
,, é fixado com um parêntese, portantovar test = (a is int?) & b;
. Também pode ser corrigido comvar test = a is int? && b;
, e dado queb
é um parâmetro de valor simples (sem efeitos colaterais sobre a avaliação) parece estranho a preferir&
mais&&
.?
é um personagem-chave.int?
como uma operação ternária (var test = a is int? <return if true> : <return if false>
), não um int anulável.bool
sobrecargas específicas . Estes são operadores lógicos booleanos (o&
forbool
) e operadores lógicos condicionais booleanos (o&&
forbool
). Observe como a primeira dessas subseções é claramente chamada de lógica . Lembre-se, em C # não há conversões ("casts") entrebool
os tipos numéricos!Aparentemente, há uma diferença entre os dois ao usar a geração de Entity Framework (EF) de código primeiro:
Quando sua entidade contém uma propriedade declarada como:
EF não irá gerar uma propriedade anulável e você terá que forçar o gerador para torná-la anulável assim:
Por outro lado, se você declarar sua entidade como:
o gerador EF irá gerar uma propriedade anulável com um campo anulável na tabela de banco de dados correspondente.
fonte
Nullable
definição em algum lugar, porque com o embutidoNullable<T>
, não é possível para EF ver a diferença entre os dois. Mesmo que o pessoal da EF quisesse tratá-los de maneira diferente, eles não poderiam.Nullable é um tipo genérico, mas int? não é.
Existem alguns cenários em que Nullable deve ser usado em vez de int?
por exemplo: aqui você não pode substituir Nullable por int?
como você pode alterar o código abaixo sem usar Nullable ?
fonte
Nullable<T>
éNullable<int>