Je suis confronté au problème que C # dans mon cas ne peut pas lancer le numéro 1 à bool. Dans mon scénario, (bool)intValue
Ne fonctionne pas. Je reçois un InvalidCastException
. Je sais que je peux utiliser Convert.ToBoolean(...)
mais je me demande simplement que cela ne fonctionne pas. Une explication à cela?
Mon code est
if (actualValueType.Name == "Boolean" || setValueType.Name == "Boolean")
{
if ((bool)actualValue != (bool)setValue)
...
}
int
et bool
ne peuvent pas être convertis implicitement (contrairement à C++, par exemple).
C'était un décision prise par les concepteurs de langage afin de sauver le code des erreurs quand un nombre était utilisé dans une condition. Les conditions doivent prendre explicitement une valeur boolean
.
Il n'est pas possible d'écrire:
int foo = 10;
if(foo) {
// Do something
}
Imaginez si le développeur voulait comparer foo avec 20 mais a raté un signe d'égalité:
if(foo = 20) {
// Do something
}
Le code ci-dessus va compiler et fonctionner - et les effets secondaires peuvent ne pas être très évidents.
Des améliorations similaires ont été apportées à switch
: vous ne pouvez pas passer d'un cas à l'autre - vous avez besoin d'un break
ou return
explicite.
Inutile de lancer:
bool result = intValue == 1;
De la documentation:
L'inclusion de bool facilite l'écriture de code auto-documenté
une valeur booléenne est vraie ou fausse
bool b = Convert.ToBoolean(0);
Convertira 0 et null en faux et tout le reste en vrai.
"Dans d'autres langages, false est équivalent à 0 et true est équivalent à 1, mais ce n'est pas possible dans le langage C #."
Je dois admettre que je pensais que false était zéro et true était! False ....
int fred = 2;
if (fred == true)
{
printf("fred is true");
}
imprimera certainement fred est vrai
Je travaille sur un parcours, à des fins d'apprentissage. J'ai besoin de bloquer au hasard certains nœuds comme pouvant être parcourus/bloqués.
Voici une solution simple que j'ai trouvée:
int block = Random.Range(0, 10) + 1;
node.blocked = (block % 2 == 0) ? true : false;
Si tout ce que vous voulez, c'est de ne pas avoir à taper le != 0
Dans if (foo != 0)
, vous pouvez créer une méthode d'extension pour le type int et faire quelque chose comme if (foo.IsNonZero())
.
Si C # permettait les propriétés d'extension, vous seriez en mesure d'écrire if (foo.IsNonZero)
sans les parenthèses, ce qui à mon avis serait plus clair que l'original if (foo != 0)
, mais malheureusement, ce n'est actuellement pas le cas. l'affaire.
Cependant, vous êtes probablement mieux avec la Convert.ToBoolean(foo)
précédemment suggérée.
si vous voulez lancer deux valeurs de variable dans bool comme var qui contient (1 et 2 et voulez retourner 1 pour faux et 2 pour vrai) je suggère:
//in the end of method or something :
return w == 2;
Dans d'autres langages, false est équivalent à 0 et true est équivalent à 1, mais ce n'est pas possible dans le langage C #.
Répétez probablement les autres ici, mais vous ne pouvez pas convertir int en bool car int n'est pas un bool. C'est un int. Qui aurait pensé? ;-)
Vous devez créer un nouveau booléen basé sur votre valeur int, et le "myvar! = 0" déjà publié semble assez bon.
Aussi, où obtenez-vous votre exception? L'exécution du code suivant produira très certainement une erreur de compilation:
int myIntValue = 0;
bool myBoolValue = (bool)myIntValue;
Vous devez faire des trucs génériques qui ne figurent pas dans votre question.
En C #, bool
est en fait un Boolean
struct , donc il n'est pas simplement représenté comme 1 ou 0 en interne. Il semble que les créateurs de la langue aient opté pour une approche explicite plutôt qu'implicite dans l'ensemble avec la langue. Pour accomplir ce que vous essayez de faire (pour convertir efficacement 1 en true
et 0 en false
), procédez comme suit:
if (intValue == 1) {
// do something
} else if (intValue == 0) {
// do something else
} else {
// invalid bool
}
Vous pouvez également supprimer la dernière clause else et faire la chose typique en langage C et laisser intValue == 0
équivaut à false
et tout le reste est true
.
Vous pouvez utiliser l'opérateur ternaire comme ci-dessous, au lieu d'un cast. bool b = vrai; int i = 1;
// bool to int
i = b == true ? 1 : 0;
// int to bool
b = i > 0 ? true : false;