不能将int转换为bool
我面临的问题是,在我的情况下,C#不能将数字1投掷到布尔。 在我的情况(bool)intValue
不起作用。 我得到一个InvalidCastException
。 我知道我可以使用Convert.ToBoolean(...)
但我只是想知道这是行不通的。 对此有何解释?
我的代码是
if (actualValueType.Name == "Boolean" || setValueType.Name == "Boolean") { if ((bool)actualValue != (bool)setValue) ... }
int
和bool
不能被隐式转换(例如,与C ++不同)。
这是语言devise者为了在条件中使用数字时从错误中节省代码而作出的一个明智的决定 。 条件需要明确地采取一个boolean
值。
这是不可能写:
int foo = 10; if(foo) { // Do something }
想象一下,如果开发者想把foo与20比较,但是错过了一个等号:
if(foo = 20) { // Do something }
上面的代码会编译和工作 – 副作用可能不是很明显。
类似的改进做了switch
:你不能从一个案件跌倒到另一个 – 你需要一个明确的break
或return
。
没有必要施放:
bool result = intValue == 1;
从文档:
包含bool使编写自我logging代码更容易
一个布尔值是真的还是假的
1.2.1预定义types(C#)
bool b = Convert.ToBoolean(0);
将0和null转换为false,其他任何东西都为true。
在其他语言中,false等同于0,true等同于1,但这在C#语言中是不可能的。
在C#中, bool
实际上是一个Boolean
结构 ,所以它不仅在内部表示为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
。
也许在这里重复别人,但是你不能把int转换成bool,因为int不是一个bool 。 这是一个int。 谁曾想到? 😉
你需要根据你的int值创build一个新的bool,已经发布的“myvar!= 0”似乎已经足够了。
另外你在哪里得到你的例外? 运行下面的代码肯定会产生一个编译错误:
int myIntValue = 0; bool myBoolValue = (bool)myIntValue;
你必须做一些通用的东西,而不是在你的问题中显示。
“在其他语言中,false等同于0,true等同于1,但这在C#语言中是不可能的。”
我不得不承认,我认为虚假是零,真实是假!
int fred = 2; if (fred == true) { printf("fred is true"); }
肯定会打印fred是真的
如果你想将两个值variables转换成布尔类似的variables持有(1和2,并希望返回1为虚假和2为真)我build议:
//in the end of method or something : return w == 2;
你可以使用下面的三元运算符,而不是一个强制转换。 bool b = true; int i = 1;
// bool to int i = b == true ? 1 : 0; // int to bool b = i > 0 ? true : false;
如果你只想在if (foo != 0)
inputif (foo != 0)
,你可以为inttypes做一个扩展方法,并执行if (foo.IsNonZero())
。
如果C#允许扩展属性,你可以写if (foo.IsNonZero)
而不用括号,在我看来,它会比原来的if (foo != 0)
更清楚地阅读,但不幸的是,那当前不是案件。
尽pipe如此,你可能会更好地使用先前build议的Convert.ToBoolean(foo)
。
为了学习目的,我正在寻找path。 我需要随机拦截一些节点,如walkable / blocked。
这是我想出的一个简单的解决scheme:
int block = Random.Range(0, 10) + 1; node.blocked = (block % 2 == 0) ? true : false;