una tipo puede implícitamente explícita existe convertir conversión c# .net

c# - no se puede convertir implícitamente el tipo ''bool?'' a ''bool''. Existe una conversión explícita(¿falta un elenco?)



no se puede convertir implícitamente el tipo int ?'' en int ya existe una conversión explícita (7)

Error: no se puede convertir implícitamente el tipo ''bool?'' a ''bool''. Existe una conversión explícita (¿falta un elenco?)

Código:

Test obj = new Test(); obj.IsDisplay = chkDisplay.IsChecked;

pero cuando uso esto significa fundido en bool entonces no hay error.

Test obj = new Test(); obj.IsDisplay = (bool) chkDisplay.IsChecked;

Necesito saber eso, ¿por qué necesito lanzar este bool a bool?

Gracias


¿Has declarado IsChecked como un bool? ( Nullable<bool> ). Un booleano anulable puede ser true , false o null . Ahora pregúntese: si IsChecked era nulo, ¿qué valor debería asignarse a IsDisplay (que solo puede ser true o false )? La respuesta es que no hay una respuesta correcta. Una conversión implícita aquí solo podría producir problemas ocultos, por lo que los diseñadores decidieron permitir solo una conversión explícita y no una implícita.


Como los otros declararon bool? no es igual a bool bool? también puede ser null , vea Nullable<t> ( msdn ).

Si sabe lo que el estado null quiere implicar, puede usar el ?? - ¿Operador de msdn nula ( msdn ) para convertir tu bool? a bool sin efectos secundarios ( Exception ).

Ejemplo:

//Let´s say "chkDisplay.IsChecked = null" has the same meaning as "chkDisplay.IsChecked = false" for you //Let "check" be the value of "chkDisplay.IsChecked", unless "chkDisplay.IsChecked" is null, in which case "check = false" bool check = chkDisplay.IsChecked ?? false;


Me enfrento a tu pregunta cuando estoy usando el operador de verificación de nulos ?. :

if (!RolesList?.Any()) //Not accepted: cannot convert bool? to bool

Así que estoy usando esto en su lugar

if (RolesList?.Any() != true) //value is null or false

En tu caso deberías configurarlo así:

obj.IsDisplay = chkDisplay.IsChecked ?? false;


Puedes usar el siguiente código

obj.IsDisplay = chkDisplay.IsChecked == true?true:false;


bool no es igual a bool?

bool puede tomar dos valores, true y false

bool? Puede tomar tres, true false y null

Por eso son diferentes.


bool? no es un bool En realidad, es un Nullable<bool> http://msdn.microsoft.com/en-us/library/b3h38hb0(v=vs.110).aspx Nullable<bool>

Si necesita el valor bool , entonces debería convertir como lo está haciendo o llamar a la propiedad .Value en el bool? . También hay una propiedad .HasValue que puede verificar para asegurarse de que no sea nula.

Si IsChecked es nulo, esta línea mostrará un error.

obj.IsDisplay = (bool) chkDisplay.IsChecked;


chkDisplay.IsChecked es de tipo bool? . Lo que significa que puede contener valores true , false y null . Sin embargo, obj.IsDisplay es de tipo bool . Lo que significa que solo puede ser true o false .

Por lo tanto, hay que convertirlo explícitamente para escribir bool . Sin embargo, esto seguirá generando una excepción si el valor que intenta convertir en bool es null .

bool? nullableBool = null; bool notNullableBool = (bool)nullableBool; //This will throw InvalidOperationException