valor - nullables c#
No se puede lanzar int a bool (11)
Estoy enfrentando el problema de que C # en mi caso no puede lanzar el número 1 a bool. En mi escenario (bool)intValue
no funciona. Obtengo una InvalidCastException
. Sé que puedo usar Convert.ToBoolean(...)
pero me pregunto si no funciona. ¿Alguna explicación para esto?
Mi codigo es
if (actualValueType.Name == "Boolean" || setValueType.Name == "Boolean")
{
if ((bool)actualValue != (bool)setValue)
...
}
"En otros idiomas, false es equivalente a 0 y true es equivalente a 1, pero esto no es posible en el lenguaje C #".
Tengo que admitir que pensé que lo falso era cero y lo verdadero era! Falso ...
int fred = 2;
if (fred == true)
{
printf("fred is true");
}
sin duda va a imprimir fred es cierto
En C #, bool
es en realidad una estructura Boolean
, por lo que no solo se representa como 1 o 0 internamente. Parece que los creadores del lenguaje optaron por un enfoque explícito sobre implícito en general con el lenguaje. Para lograr lo que estás tratando de hacer (para convertir efectivamente 1 a true
y 0 a false
), haz esto:
if (intValue == 1) {
// do something
} else if (intValue == 0) {
// do something else
} else {
// invalid bool
}
También puede descartar la última cláusula más y hacer lo típico en lenguaje C y dejar que intValue == 0
sea ​​equivalente a false
y cualquier otra cosa es true
.
En otros idiomas, false es equivalente a 0 y true es equivalente a 1, pero esto no es posible en el lenguaje C #.
Estoy trabajando en un pathfinding, con fines de aprendizaje. Necesito bloquear aleatoriamente algunos nodos como transitables / bloqueados.
Aquí hay una solución simple que se me ocurrió:
int block = Random.Range(0, 10) + 1;
node.blocked = (block % 2 == 0) ? true : false;
No hay necesidad de lanzar:
bool result = intValue == 1;
De la documentación:
La inclusión de bool facilita la escritura de código autodocumentado
un valor bool es verdadero o falso
Podría usar el operador ternario como abajo, en lugar de un molde. bool b = verdadero; int i = 1;
// bool to int
i = b == true ? 1 : 0;
// int to bool
b = i > 0 ? true : false;
Probablemente repita otros aquí pero no puede lanzar int a bool porque int no es un bool . Es un int. ¿Quien lo hubiera pensado? ;-)
Necesitas crear un nuevo bool basado en tu valor int, y el ya publicado "myvar! = 0" parece suficientemente bueno.
Además, ¿de dónde sacas tu excepción? Ejecutar el siguiente código sin duda producirá un error de compilación:
int myIntValue = 0;
bool myBoolValue = (bool)myIntValue;
Debes estar haciendo algunas cosas genéricas que no se muestran en tu pregunta.
Si desea convertir dos variables de valores en bool como var que contiene (1 y 2 y desea devolver 1 para falso y 2 para verdadero), sugiero:
//in the end of method or something :
return w == 2;
Si todo lo que desea es no tener que escribir el != 0
en if (foo != 0)
, podría crear un método de extensión para el tipo int y hacer algo como if (foo.IsNonZero())
.
Si C # permitiera las propiedades de extensión, podría escribir if (foo.IsNonZero)
sin los paréntesis, lo que en mi opinión sería más claro que el original if (foo != 0)
, pero lamentablemente, ese no es el caso.
Sin embargo, probablemente estés mejor con el Convert.ToBoolean(foo)
sugerido anteriormente.
int
y bool
no se pueden convertir implícitamente (a diferencia de C ++, por ejemplo).
Fue una decisión consciente tomada por los diseñadores de idiomas para guardar el código de los errores cuando se usaba un número en una condición. Las condiciones deben tomar un valor boolean
explícitamente.
No es posible escribir:
int foo = 10;
if(foo) {
// Do something
}
Imagínese si el desarrollador quisiera comparar foo con 20 pero perdió un signo de igualdad:
if(foo = 20) {
// Do something
}
El código anterior se compilará y funcionará, y los efectos secundarios pueden no ser muy obvios.
Se hicieron mejoras similares para switch
: no puede pasar de un caso a otro; necesita una break
o return
explícita.
bool b = Convert.ToBoolean(0);
Convertirá 0 y nulo a falso y cualquier otra cosa a verdadero.