代码之家  ›  专栏  ›  技术社区  ›  simendsjo

为什么null的值不等于false?

  •  22
  • simendsjo  · 技术社区  · 15 年前

    原因是什么 null false 在条件句中?

    我首先考虑了作业,以避免使用 = 而不是 ==

    if (someClass = someValue) // cannot convert someClass to bool. Ok, nice
    
    if (someClass) // Cannot convert someClass to bool. Why?
    
    if (someClass != null) // More readable?
    

    我认为这是相当合理的假设 无效的 方法 . 还有其他语言也使用这个,我也没有因为它而产生bug。

    编辑:

    丹尼尔·埃尔威克对任务错误的一个很好的评论。。。它编译时没有警告,因为它的计算结果是 bool :

    bool bool1 = false, bool2 = true;
    if (bool1 = bool2)
    {
        // oops... false == true, and bool1 became true...
    }
    
    11 回复  |  直到 9 年前
        1
  •  24
  •   Tim Robinson    15 年前

    这是C语言的一个特殊设计功能: if statements accept only a bool .

    IIRC这是为了安全:特别是,为了 if (someClass = someValue)

    编辑: 一个好处是它使 if (42 == i)

        2
  •  22
  •   Matthew Abbott    15 年前

    “我认为假设null意味着false是相当合理的”

    不是在C#。false是一个布尔结构,一个值类型。值类型不能有空值。如果您想完成您所取得的成就,您必须创建特定类型的自定义布尔转换器:

    public class MyClass
    {
        public static implicit operator bool(MyClass instance)
        {
            return instance != null;
        }
    }
    

    通过以上步骤,我可以:

    if (instance) {
    
    }
    

    等。

        3
  •  14
  •   Rob Levine    15 年前

    我不同意。通常情况下,“假”的意思是“不”。Null表示“我不知道”;i、 完全不确定。

        4
  •  5
  •   kemiller2002    15 年前

    我想到的一件事是,在一个数据类型的实例中,比如int?Int不能为null,所以它们总是求值为true吗?您可以假设int=0为false,但这开始变得非常复杂,因为0是一个有效值(其中可能0的值应该为true,因为程序设置了它),而不仅仅是一个默认值。
    在很多边缘情况下,null不是一个选项,或者有时是一个选项,而有时不是。

        5
  •  5
  •   Gage    15 年前

    只需使用if(Convert.ToBoolean(someClass))

    http://msdn.microsoft.com/en-us/library/wh2c31dd.aspx

    值类型:System.Object实现 IConvertible接口,或null。 返回值

    它反映了 调用IConvertible.ToBoolean 价值观。如果值为null,则方法

        6
  •  4
  •   Vivin Paliath    15 年前

    据我所知,这是您在动态语言中看到的特性,而C#不是(根据语言规范) if 只接受 bool 或计算结果为 ).

    我认为这样假设是不合理的 null false 在里面 案例。这在某些情况下是有意义的,但在其他情况下则没有意义。例如,假设您有一个可以有三个值的标志: 未设置 ,和 . 在这种情况下, 设置 会是 true 未设置 会是 会是 无效的 . 如你所见,在这种情况下 无效的 不是 .

        7
  •  3
  •   diadem    15 年前

    因为null和false是不同的东西。

    布尔就是一个很好的例子?福

    如果foo的值为true,则其值为true。
    如果foo的值为false,则其值为false
    如果foo没有任何赋值,则其值为null。

    这是三个逻辑上独立的条件。

    换个角度想想
    " 我欠你多少钱? "
    " “和” 我没有这个信息

        8
  •  3
  •   Daniel Earwicker    15 年前

    null不存在的原因是什么 条件句中的求值为false?

    避免使用 = 而不是 ==

    这不是原因。我们知道这一点是因为如果两个被比较的变量恰好是 bool

    bool a = ...
    bool b = ...
    
    if (a = b)
        Console.WriteLine("Weird, I expected them to be different");
    

    如果 b 如果为真,则打印消息(并且 a

    null 布尔 很简单,除非用户定义类型的设计器请求,否则C#避免隐式转换。C++历史书充满了由隐式转换引起的痛苦故事。

        9
  •  3
  •   Victor - Reinstate Monica    9 年前

    从结构上讲,大多数“不能想到任何技术原因”的人都错了。

    代码由CPU运行。 大多数(如果不是全部)CPU都有 , 比特组的解释 0 , 1 ,一个 byte ,一个 word ,一个 dword qword 等等。

    也就是说,某些东西在机器代码中不是“相等”、“零”、“更大”、“更小”、“更大或相等”就是“更小或相等”。世上没有 null , false true .

    是的 1 , ,和 无效的 0x00 , 0x0000 , 0x00000000 ,或 0x0000000000000000 地址总线 宽度。

    C#是一个例外,因为它是一个间接类型,其中两个可能的值 0 1 指数 结构(思考 enum PTR 在x86汇编中)。

    这是故意的。

    但需要注意的是,这样的设计决策 精心制作的 决定,而 传统,直截了当 方法是假设 0 , 无效的 我们是平等的。

        10
  •  2
  •   avpaderno    15 年前

    C不象C++那样对参数进行转换。如果希望 if 语句接受值。

        11
  •  1
  •   Morfildur    15 年前

    与PHP、Perl等语言相比,它只是c的类型系统。

    条件只接受 Boolean 值,null没有类型 布尔值 所以它在那里不起作用。

    至于在另一个注释中提到的C/C++中的空例子,必须说明C和C++都没有布尔类型(AfA+ C++通常有一个BooL的类型转换为int,但这是另一回事),它们也没有空引用,只有null(= & Gt;0)-指针。

    当然,编译器设计人员可以实现将任何可为null的类型自动转换为布尔类型,但这会导致其他问题,例如:

    假设 foo null :

    if (foo)
    {
      // do stuff
    }
    


    如果不是空的,总是这样吗?
    但是如果你想把你的类型转换成布尔型(也就是说,从你的三态或量子逻辑类)?

    这意味着您将有两种不同的bool转换,隐式和显式,它们的行为都不同。

    if (!!foo) // common pattern in C to normalize a value used as boolean,
               // in this case might be abused to create a boolean from an object
    {
    }
    

    (foo == null)