2012-02-01 31 views
23

Estoy tratando de convertir mi valor bool nullable y estoy obteniendo este error.¿Imposible convertir implícitamente tipo bool?

Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?) 

Por ejemplo:

public virtual bool? MyBool 
    { 
    get; 
    set; 
    } 

if (!MyBool){} 
+2

En resumen, los boole de nullable son confusos. (solo mira SQL) – SLaks

+0

No creo que esto sea demasiado confuso, es solo Ternary Logic: http://en.wikipedia.org/wiki/Three-valued_logic - De hecho, me gusta porque me gusta la idea de algo sin valor En otras palabras, no inicializado vs. inicializado. – dyslexicanaboko

Respuesta

30

Como los estados de error, no se puede utilizar un bool? en una condicional. (¿Qué pasaría si se trata de null?)

su lugar, puede escribir o if (MyBool != true)if (MyBool == false), dependiendo de si desea incluir null. (Y se debe añadir un comentario explicando que)

+5

Otra comprobación válida es 'MyBool ?? falso', aunque generalmente prefiero 'MyBool.GetValueOrDefault()'. –

+0

@AnthonyPegram: Sin embargo, eso requiere paréntesis adicionales para la negación, y también es más confuso. – SLaks

+0

No estoy en desacuerdo con el primero, pero no encuentro el segundo más difícil de usar o comprender. Generalmente, no me gustan las comparaciones directas con verdadero o falso, aunque hago exactamente eso en consultas de Linq-to-EF porque el método no es compatible. –

9

Usted tiene que usar MyBool.Value

por ejemplo:

Sin embargo, debe probar que efectivamente tiene un valor, para empezar . Esto prueba que MyBool tiene un valor y es falso.

if (MyBool.HasValue && !MyBool.Value) { } 

O tal vez desee realmente lo siguiente que ejecuta el bloque de código si no se ha asignado o si tiene es falso.

if (!MyBool.HasValue || !MyBool.Value) { } 

La pregunta realmente se reduce a si realmente la intención de tener una variable booleana anulable y, si es así, ¿cómo quiere manejar las 3 condiciones posibles de null, true or false.

2

Necesita verificar si tiene un valor. ¿Qué desea hacer si MyBool == null?

if(MyBool.HasValue && !MyBool.Value) // MyBool is false 
if(MyBool.HasValue && MyBool.Value) // MyBool is true 
if(!MyBool.HasValue) // MyBool is null 
Cuestiones relacionadas