我遇到的问题是,在我的情况下,C#无法将数字1转换为bool。在我的方案中(bool)intValue
不起作用。我得到一个InvalidCastException
。我知道我可以使用Convert.ToBoolean(...)
,但我只是想知道它不起作用。对此有何解释?
我的代码是
if (actualValueType.Name == "Boolean" || setValueType.Name == "Boolean")
{
if ((bool)actualValue != (bool)setValue)
...
}
答案 0 :(得分:54)
没有必要施放:
bool result = intValue == 1;
来自文档:
包含bool可以更容易地编写自我记录代码
bool值为true或false
答案 1 :(得分:39)
int
和bool
(例如,与C ++相比)。
这是语言设计者做出的有力的决定,以便在条件中使用数字时保存代码免于错误。条件需要明确地采用boolean
值。
无法写:
int foo = 10;
if(foo) {
// Do something
}
想象一下,如果开发人员想要将foo与20进行比较但是错过了一个等号:
if(foo = 20) {
// Do something
}
以上代码将编译和工作 - 副作用可能不是很明显。
对switch
进行了类似的改进:你不能从一个案件落到另一个案件 - 你需要一个明确的break
或return
。
答案 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;