Hay alguna diferencia entre el tipo?y que aceptan valores null<type>?
Pregunta
En C# son los que aceptan valores null tipos primitivos (es decir, bool?
) sólo alias para su correspondiente Nullable<T>
tipo o es que hay una diferencia entre los dos?
Solución
Si usted mira la IL utilizando Ildasm, usted encontrará que ambos compilar hacia abajo para Nullable<bool>
.
Otros consejos
No hay ninguna diferencia entre bool? b = null
y Nullable<bool> b = null
.El ?
es sólo compilador de C# de la sintaxis de azúcar.
Para acceder al valor de la bool?usted necesita hacer lo siguiente:
bool? myValue = true;
bool hasValue = false;
if (myValue.HasValue && myValue.Value)
{
hasValue = true;
}
Nota usted no puede hacer:
if (myValue)
{
hasValue = true;
}
Me sorprende que nadie se iba a la fuente (C# spec) todavía.Del artículo 4.1.10 tipos que aceptan valores null:
Un tipo que acepta valores null se escribe T?, donde T es el tipo subyacente.Esta sintaxis es la abreviatura de Sistema.Que aceptan valores null<T>y las dos formas pueden ser utilizados indistintamente.
Así que no, no hay ninguna diferencia entre las dos formas.(Suponiendo que usted no tiene cualquier otro tipo de llamada Nullable<T>
en cualquiera de los espacios de nombres que se usan).
Un Nullable<T>
es una estructura que consta de una T y un poco de la bandera que indica si es o no es válido.Un Nullable<bool>
tiene tres posibles valores:true, false y null.
Editar: Ah, me olvidaba el hecho de que el signo de interrogación después de "bool" era en realidad parte de el nombre del tipo y no un indicador de que estaban haciendo una pregunta :).La respuesta a tu pregunta, entonces, es "sí, el C# bool?
es simplemente un alias Nullable<bool>
".
Un bool
es un tipo de valor, por lo tanto no puede contener un valor NULO.Si usted envolver cualquier tipo de valor con Nullable<>
, que le dará esa posibilidad.Por otra parte, los métodos de acceso para el cambio de valor por propiedades adicionales HasValue
y Value
.
Pero a la pregunta: Nullable<bool>
y bool?
son alias.
No hay ninguna diferencia.En resumen:
Sistema.Boolean -> valores válidos :true, false
bool -> alias para el Sistema.Boolean
Que aceptan valores null<bool> -> valores válidos :true, false, null
bool?-> alias para los que aceptan valores null<bool>
Espero que esto ayude.
Null primitivas son sólo regulares primitivas envuelto en los aceptan.Cualquier al contrario de las apariencias son sólo el compilador y sintácticos de azúcar.
Ninguna diferencia.Echa un vistazo aquí: http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx
"La sintaxis de T?es una abreviatura para el que acepta valores null, donde T es un tipo de valor.Las dos formas son intercambiables."