【问题标题】:C# can't cast bool to intC# 不能将 bool 转换为 int
【发布时间】:2009-06-03 19:31:59
【问题描述】:

我们都知道在 C# 中我们不能将 bool 转换为 int。我想用位掩码看看 true 的二进制表示是什么,但我不能使用 (bool & int).. 我认为问题在于架构设计“true is true, not any number != 0” (C++)我想知道这种架构的好处是什么? C 真/假概念有什么不好?

【问题讨论】:

标签: c# .net


【解决方案1】:

当整数不能用于truefalse 时,程序员会更清楚。

if (5 > 0)if(5) 更容易理解

这与它们不允许在 switch 语句中出现条件的原因相同。太容易犯错了。

【讨论】:

  • 我实际上很不喜欢他们在 C# 中使用 switch 语句的方式。在很多情况下,失败是非常有用的。
  • @Joseph:仍然允许最不容易出错的情况 - 如果您不先做任何工作,您可能会失败。但是在做其他“工作”之后有一个案例失败是不容易维护的。
  • @Joseph:它有用并不意味着它不容易出错或不容易出错。
  • @Fredrik & Reed 我明白,我只是不认为这很容易出错,但我想这只是我的(不常见的)观点。在 C++ 的意义上,我从来没有遇到过理解 switch 语句结构的困难,但我想我可以理解为什么其他人会发现它在概念上更容易 C# 方式。
  • @Joseph 我不认为理解它的工作原理是他们正在预防的问题。我认为他们只是试图阻止人们打错字,主要是忘记将 break 语句放在案例的末尾。我同意你的观点,在某些情况下它会有所帮助,有时我无法使用它会让人有点沮丧,但我敢打赌,不能这样做已经为我节省了更多的时间。
【解决方案2】:

在 C 中,整数经常被用作普通数和布尔值,例如当某个数不为零时运行的 for 循环。这种用法显然有其简洁代码的优点,就像一个幼稚的 strlen 例程:

const char *s;
for (s = str; *s; ++s)
    ;
return (s - str);

但虽然简短,但它掩盖了 sn-p 的真正目的,它本质上是说“循环,而我正在查看的字符不是空字符”。但是写下来只是说“当我喜欢它时将其视为布尔值,在其他情况下将其视为数字”。

据称这种双重性质经常导致问题,并降低代码的可读性(因为您必须根据上下文判断int 的给定用法是打算用作int 还是bool)。

如果你绝对需要使用布尔值作为整数,你可以使用

Convert.ToInt32(someBool)

Noldorin mentioned 或自己滚动

someBool ? 1 : 0

两者都清楚地表明您使用的是int(而不是bool)。

【讨论】:

  • 三元运算符很慢。 Bool 是一种数字类型,应该可以强制转换以用于算术运算。
【解决方案3】:

仅供参考,Convert.ToInt32(fooBool) 应该告诉您true 用 1 表示,false 用 0 表示。(这是 BCL 中的任意表示,但不一定是使用它的内存。 )

这里的重点是,位表示对于任何程序员来说真的应该是毫无意义的。布尔值用于特定目的(即标志),不应与整数混合使用,否则变量的使用可能会变得相当混乱。

【讨论】:

    【解决方案4】:

    我认为这个问题与真/假或 1/0 无关,因为它是关于使 C# 成为强类型语言而不是弱类型语言的决定。强类型语言有很多好处(也有一些缺点)。好处之一是它减少了由于表达式的误用(或不正确使用)而导致的错误。

    例如,

    int i = 0;
    if (i = 1) {
       ...
    }
    

    甚至不会在 C# 中编译,但它会在 C 中编译和执行都不正确。

    选择使 C# 成为一种强类型语言意味着 C# 程序员有这些好处。即便如此,如果他们愿意的话,他们也可以引入从 bool 到 int(以及返回)的转换。我怀疑他们没有这样做是因为可能会引入上述错误。

    【讨论】:

    • 这与“强类型”无关。 if (i=1) 它在 C 中是可能的,因为赋值运算符返回一个值(如果你想做 a = b = c = 5,这很有用)例如,Python 是强类型的,并且赋值是一个语句,而不是' t“返回”什么。所以做类似“if a = 3:”的事情是错误的。但是python本身有一条规则说“任何东西都有布尔解释”:空collectios,0,空字符串是False,其他任何东西都是True,所以你可以做mylist = [] if mylist: something
    • 是的,但是它允许在这个上下文中使用赋值结果的原因是因为它是弱类型的。几乎可以肯定,意图是 i == 1,这是一个布尔结果,并且在 C# 中将允许在该上下文中。如果 C 是强类型的,则在这种情况下将不允许分配的结果,就像在 C# 中一样。事实上,赋值的结果(在这种情况下是错误的)被随意评估为布尔值,因此产生了一个错误。
    【解决方案5】:

    我们可以使用Convert.ToInt32,它的定义在这里:

    public static int ToInt32(bool value);
    

    【讨论】:

      【解决方案6】:

      没有人喜欢任何其他实体的所有决定...只需编写您自己的转换器(快速和肮脏)

      【讨论】:

        【解决方案7】:
        var n = (bool)your_int ? 1 : 0
        

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        【解决方案8】:

        int n = (bBool) ? 1 : 0

        【讨论】:

        • 我几乎不得不反对你使用匈牙利符号,yuk!
        【解决方案9】:

        number != 0,太容易出错了。

        C# 做出了许多设计决策来颠覆此类可能导致的常见错误。

        【讨论】:

        • 不知道你的意思是什么。也许你可以详细说明一下。
        • 通过不允许像 if (27) 这样的语言迫使人们采用更可靠的语法,例如:if (27 > 0)
        • 啊,我现在看到“数字 1=0”是原始帖子的直接 sn-p。也许在您的答案中添加更多上下文将有助于读者理解您的观点。以目前的形式,它本身没有意义。一般来说,最好在您的答案中包含某种形式的原始问题,它不需要是直接引用,而是原始问题的改写。
        【解决方案10】:

        您在这些方面提出了很好的观点。但是它确实删除了一个快捷方式。

        使用 c,可以通过代码“bBool = 1 - bBool”轻松完成切换。

        如果 bBool 为真 (1),则 1 - 1 = 0。bBool 变为假。

        如果 bBool 为假 (0),则 1 - 0 = 1。bBool 变为真。

        在 C# 中,我需要做一个条件来检查状态,然后将其设置为相反的状态,这会给机器和我带来更多的工作。

        【讨论】:

        • 我错过了什么吗? bBool = !bBool; 按照你的描述做,不是吗?
        猜你喜欢
        • 2011-09-28
        • 2017-07-17
        • 1970-01-01
        • 2016-11-29
        • 2012-01-14
        • 2017-02-24
        • 1970-01-01
        • 2015-12-01
        • 2023-03-27
        相关资源
        最近更新 更多