为什么不将null评估为false?

sim*_*sjo 23 c# null conditional type-conversion

在条件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?
Run Code Online (Sandbox Code Playgroud)

我认为这null意味着相当合理false.还有其他语言也使用它,因为它没有我的错误.

编辑:我当然是指参考类型.

Daniel Earwicker关于赋值错误的一个很好的评论...这个编译没有警告,因为它评估为bool:

bool bool1 = false, bool2 = true;
if (bool1 = bool2)
{
    // oops... false == true, and bool1 became true...
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*son 23

它是C#语言中的特定设计功能:if语句只接受abool.

IIRC这是为了安全:具体来说,你的第一次if (someClass = someValue)无法编译.

编辑:一个好处是它使if (42 == i)公约("yoda比较")不必要.

  • 这个`if(a = b)`bug并没有停止,因为`a`和`b`可能是`bool`类型. (10认同)

Mat*_*ott 22

"我认为假设null意味着错误是相当合理的"

不在C#中.false是一个布尔结构,一个值类型.值类型不能具有空值.如果你想做你所做的,你必须创建你的特定类型的自定义转换器为布尔值:

public class MyClass
{
    public static implicit operator bool(MyClass instance)
    {
        return instance != null;
    }
}
Run Code Online (Sandbox Code Playgroud)

有了上述,我可以这样做:

if (instance) {

}
Run Code Online (Sandbox Code Playgroud)

等等


Rob*_*ine 14

"我认为假设null意味着错误是相当合理的"

我不同意.恕我直言,错误意味着"不".Null意为"我不知道"; 即完全不确定.

  • +1 - 做NULL*永远*意味着错误吗?我想不出任何以这种方式实现的技术的例子.可能有一些隐含地允许比较,但afaik,null从不意味着错误. (3认同)

kem*_*002 5

有一点让人想到在数据类型的实例中,比如int?Int不能为空,所以它们总是评估为真吗?你可以假设int = 0是假的,但是开始变得非常复杂,因为0是一个有效值(其中0可能评估为true,因为编程器设置它)而不仅仅是默认值.
有很多边缘情况,其中null不是一个选项,或者有时它是一个选项,有时则不是.

他们提出这样的事情来保护程序员不犯错误.它与你在案例陈述中无法做到的原因相同.


Gag*_*age 5

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

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

参数

value类型:System.Object实现IConvertible接口的对象,或null.回报价值

类型:System.Boolean true或false,它反映了通过为基础类型的值调用IConvertible.ToBoolean方法返回的值.如果value为null,则该方法返回false