无法将int强制转换为bool

时间:2011-07-04 12:15:07

标签: c# casting int boolean

我遇到的问题是,在我的情况下,C#无法将数字1转换为bool。在我的方案中(bool)intValue不起作用。我得到一个InvalidCastException。我知道我可以使用Convert.ToBoolean(...),但我只是想知道它不起作用。对此有何解释?

我的代码是

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

11 个答案:

答案 0 :(得分:54)

没有必要施放:

bool result = intValue == 1;

来自文档:

  

包含bool可以更容易地编写自我记录代码

     

bool值为true或false

1.2.1 Predefined Types (C#)

答案 1 :(得分:39)

无法隐式转换

intbool(例如,与C ++相比)。

这是语言设计者做出的有力的决定,以便在条件中使用数字时保存代码免于错误。条件需要明确地采用boolean值。

无法写:

int foo = 10;

if(foo) {
  // Do something
}

想象一下,如果开发人员想要将foo与20进行比较但是错过了一个等号:

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

以上代码将编译和工作 - 副作用可能不是很明显。

switch进行了类似的改进:你不能从一个案件落到另一个案件 - 你需要一个明确的breakreturn

答案 2 :(得分:34)

bool b = Convert.ToBoolean(0);

将0和null转换为false,将其他任何内容转换为true。

答案 3 :(得分:0)

在其他语言中,false等于0,而true等于1,但这在C#语言中是不可能的。

答案 4 :(得分:0)

在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 == 0等同于false,其他任何内容都是true

答案 5 :(得分:0)

可能在这里重复其他人但你不能把int转换为bool,因为 int不是bool 。这是一个int。谁曾想到? ;-)

你需要根据你的int值创建一个新的bool,已经发布的“myvar!= 0”似乎已经足够了。

另外,你在哪里获得例外?运行以下代码肯定会产生编译器错误:

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

你必须做一些未在你的问题中显示的通用内容。

答案 6 :(得分:0)

"在其他语言中,false等于0,而true等于1,但这在C#语言中是不可能的。"

我必须承认我认为假是零,而且是真的!假......

int fred = 2;

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

肯定会打印fred是真的

答案 7 :(得分:0)

如果你想将两个值变量转换为bool,就像var一样(1和2,并希望返回1表示false,2表示true)我建议:

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

答案 8 :(得分:0)

您可以使用下面的三元运算符,而不是强制转换。     bool b = true;     int i = 1;

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

答案 9 :(得分:0)

如果您只需要在!= 0中输入if (foo != 0),则可以为int类型创建扩展方法,并执行if (foo.IsNonZero())之类的操作。

如果C#允许使用扩展属性,那么您可以在没有括号的情况下编写if (foo.IsNonZero),在我看来,它会比原始if (foo != 0)更清楚地阅读,但遗憾的是,目前不是情况下。

不过,无论如何,你可能会更好地使用之前建议的Convert.ToBoolean(foo)

答案 10 :(得分:0)

为了学习目的,我正在寻找寻路。我需要随机阻止一些节点作为步行/阻止。

这是我提出的一个简单的解决方案:

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