Ne peut pas lancer int pour booler

Je suis confronté au problème que C # dans mon cas ne peut pas jeter le numéro 1 à la bool. Dans mon scénario (bool)intValue ne fonctionne pas. Je reçois une InvalidCastException . Je sais que je peux utiliser Convert.ToBoolean(...) mais je me demande si 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).

Ce fut une décision concise prise par les concepteurs de langage afin de sauver le code des erreurs lorsqu’un numéro é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 manquait un signe d’égalité:

 if(foo = 20) { // Do something } 

Le code ci-dessus comstackra et fonctionnera – et les effets secondaires peuvent ne pas être très évidents.

Des améliorations similaires ont été apscopes pour switch : vous ne pouvez pas tomber d’un cas à l’autre – vous avez besoin d’une break ou d’un return explicite.

Il n’y a pas besoin 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

1.2.1 Types prédéfinis (C #)

 bool b = Convert.ToBoolean(0); 

Convertira 0 et null en false et tout le rest en true.

Dans les autres langages, false équivaut à 0 et true à 1, mais ce n’est pas possible dans le langage C #.

En C #, bool est en fait une structure Boolean , donc ce n’est pas seulement représenté en tant que 1 ou 0 en interne. Il semble que les créateurs du langage aient opté pour une approche explicite par rapport à la langue. Pour accomplir ce que vous essayez de faire (pour lancer efficacement 1 à true et 0 à 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 clause last else et faire le truc en langage C et laisser intValue == 0 être équivalent à false et tout le rest est true .

Répétant probablement d’autres ici mais vous ne pouvez pas lancer int pour booler car int n’est pas un bool . C’est un int. Qui aurait pensé? 😉

Vous devez créer un nouveau bool en fonction de votre valeur int, et le message “myvar! = 0” déjà publié semble suffisant.

Aussi, où obtenez-vous votre exception? L’exécution du code suivant produira certainement une erreur de compilation:

 int myIntValue = 0; bool myBoolValue = (bool)myIntValue; 

Vous devez faire des choses génériques qui ne figurent pas dans votre question.

“Dans les autres langages, false équivaut à 0 et true à 1, mais ce n’est pas possible dans le langage C #.”

Je dois admettre que je pensais que le faux était nul et vrai était faux!

 int fred = 2; if (fred == true) { printf("fred is true"); } 

va certainement imprimer fred est vrai

si vous voulez convertir deux valeurs variables en bool comme var qui contient (1 et 2 et que vous voulez renvoyer 1 pour faux et 2 pour vrai), je suggère:

 //in the end of method or something : return w == 2; 

Vous pouvez utiliser l’opérateur ternaire comme ci-dessous, au lieu d’une dissortingbution. bool b = true; int i = 1;

 // bool to int i = b == true ? 1 : 0; // int to bool b = i > 0 ? true : false; 

Si tout ce que vous voulez 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 # autorisait les propriétés d’extension, vous pourriez é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. Cas.

Convert.ToBoolean(foo) vous êtes probablement mieux avec la version précédemment suggérée Convert.ToBoolean(foo) .

Je travaille sur un cheminement, à des fins d’apprentissage. Je dois bloquer au hasard certains nœuds comme pouvant être parcourus / bloqués.

Voici une solution simple:

 int block = Random.Range(0, 10) + 1; node.blocked = (block % 2 == 0) ? true : false;