web-dev-qa-db-ja.com

intをboolにキャストできません

私の場合、C#は数値1をブールにキャストできないという問題に直面しています。私のシナリオでは_(bool)intValue_は機能しません。 InvalidCastExceptionを取得します。 Convert.ToBoolean(...)を使用できることは知っていますが、機能しないのではないかと思っています。これについての説明はありますか?

私のコードは

_if (actualValueType.Name == "Boolean" || setValueType.Name == "Boolean")
{
   if ((bool)actualValue != (bool)setValue)
   ...
}
_
47
theknut

intboolは、暗黙的に変換できません(たとえば、C++とは対照的です)。

条件で数値が使用されたときのエラーからコードを保存するために、それは言語設計者による慎重な決定でした。条件は、boolean値を明示的にとる必要があります。

書くことはできません:

int foo = 10;

if(foo) {
  // Do something
}

開発者がfooを20と比較したいが、1つの等号を逃したと想像してください:

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

上記のコードはコンパイルされて動作します-副作用はあまり明白ではないかもしれません。

switchに対しても同様の改善が行われました。あるケースから別のケースに移行することはできません。明示的なbreakまたはreturnが必要です。

39
Jakub Konecki

キャストする必要はありません。

bool result = intValue == 1;

ドキュメントから:

Boolを含めると、自己文書化コードを簡単に記述できます

ブール値はtrueまたはfalseです

1.2.1事前定義型(C#)

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

0とnullをfalseに変換し、他のすべてをtrueに変換します。

36
kravits88

「他の言語では、falseは0に相当し、trueは1に相当しますが、C#言語ではこれは不可能です。」

Falseはゼロで、trueは!falseだったと認めなければなりません。

int fred = 2;

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

フレッドが本当であることは確かに印刷されます

1
Dave

学習目的で、経路探索に取り組んでいます。一部のノードをウォーク可能/ブロック済みとしてランダムにブロックする必要があります。

ここに私が思いついた簡単な解決策があります:

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

if (foo != 0)!= 0を入力する必要がない場合は、int型の拡張メソッドを作成してif (foo.IsNonZero())のような操作を行うことができます。

C#が拡張プロパティを許可している場合、括弧なしでif (foo.IsNonZero)を書くことができます。これは、私の意見では、元のif (foo != 0)よりも明確に読みますが、残念ながら、現在はそうではありません。

ただし、以前に提案されたConvert.ToBoolean(foo)を使用した方がよいでしょう。

0
Dhi

2つの値の変数を保持するvarのようなboolにキャストしたい場合(1と2、falseの場合は1、trueの場合は2を返したい)

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

他の言語では、falseは0に相当し、trueは1に相当しますが、C#言語ではこれは不可能です。

0
Jacob Seleznev

おそらくここで他の人を繰り返しますが、intはboolではないであるため、intをboolにキャストすることはできません。 intです。誰が考えただろうか? ;-)

Int値に基づいて新しいboolを作成する必要があり、すでに投稿されている「myvar!= 0」で十分なようです。

また、例外はどこで得られますか?次のコードを実行すると、間違いなくコンパイラエラーが発生します。

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

あなたはあなたの質問に示されていないいくつかの一般的なことをしなければなりません。

0
UrbanEsc

C#では、boolは実際には Boolean struct であるため、内部で1または0として表されるだけではありません。言語の作成者は、言語全体で明示的で暗黙的なアプローチを採用したようです。しようとしていることを達成するために(1をtrueに、0をfalseに効果的にキャストするため)、次のようにします。

if (intValue == 1) {
    // do something
} else if (intValue == 0) {
    // do something else
} else {
    // invalid bool
}

また、最後のelse句を削除し、典型的なC言語のことをして、intValue == 0falseと同等であり、それ以外はtrueです。

0
FishBasketGordo

キャストの代わりに、以下のような三項演算子を使用できます。 bool b = true; int i = 1;

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