web-dev-qa-db-fra.com

Je ne peux pas lancer un int

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)
   ...
}
47
theknut

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.

39
Jakub Konecki

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

1.2.1 Types prédéfinis (C #)

55
Ritch Melton
bool b = Convert.ToBoolean(0);

Convertira 0 et null en faux et tout le reste en vrai.

36
kravits88

"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

1
Dave

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;
0
Artorias2718

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.

0
Dhi

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;
0
Hany Hassan

Dans d'autres langages, false est équivalent à 0 et true est équivalent à 1, mais ce n'est pas possible dans le langage C #.

0
Jacob Seleznev

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.

0
UrbanEsc

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.

0
FishBasketGordo

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;
0
Muflix