Existe alguma diferença entre o tipo?e anulável<tipo>?
Pergunta
Em C# estão os tipos primitivos anuláveis (ou seja, bool?
) apenas apelidos para seus correspondentes Nullable<T>
tipo ou há diferença entre os dois?
Solução
Se você olhar para o IL usando Ildasmo, você descobrirá que ambos são compilados para Nullable<bool>
.
Outras dicas
Não há diferença entre bool? b = null
e Nullable<bool> b = null
.O ?
é apenas açúcar de sintaxe do compilador C #.
Para acessar o valor do bool?você precisa fazer o seguinte:
bool? myValue = true;
bool hasValue = false;
if (myValue.HasValue && myValue.Value)
{
hasValue = true;
}
Observe que você não pode simplesmente fazer:
if (myValue)
{
hasValue = true;
}
Estou surpreso que ninguém tenha acessado a fonte (a especificação C#) ainda.De §4.1.10 Tipos anuláveis:
Um tipo anulável é escrito T?, onde T é o tipo subjacente.Essa sintaxe é uma abreviação de System.Nullable<T> e os dois formulários podem ser usados de forma intercambiável.
Então, não, não há diferença entre as duas formas.(Supondo que você não tenha nenhum outro tipo chamado Nullable<T>
em qualquer um dos namespaces que você usa.)
A Nullable<T>
é uma estrutura que consiste em um T e um sinalizador de bit que indica se o T é válido ou não.A Nullable<bool>
tem três valores possíveis:verdadeiro, falso e nulo.
Editar: Ah, perdi o fato de que o ponto de interrogação após "bool" era na verdade parte do nome do tipo e não um indicador de que você estava fazendo uma pergunta :).A resposta à sua pergunta, então, é "sim, o C# bool?
é apenas um apelido para Nullable<bool>
".
A bool
é um tipo de valor, portanto não pode conter um valor NULL.Se você agrupar qualquer tipo de valor com Nullable<>
, isso lhe dará essa habilidade.Além disso, os métodos de acesso ao valor mudam por propriedades adicionais HasValue
e Value
.
Mas para a pergunta: Nullable<bool>
e bool?
são apelidos.
Não, não há diferença.Resumindo:
System.Boolean -> valores válidos:verdadeiro falso
bool -> alias para System.Boolean
Anulável<bool> -> valores válidos:verdadeiro, falso, nulo
bool?-> alias para Anulável<bool>
Espero que isto ajude.
Primitivas nulas são apenas primitivas regulares envolvidas em Nullable.Qualquer aparência em contrário é apenas o compilador e o açúcar sintático.
Não há diferença.Dê uma olhada aqui: http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx
"A sintaxe T?é uma abreviação de Nullable, onde T é um tipo de valor.As duas formas são intercambiáveis."