为什么null不计算为false?null在条件中不计算为false的原因是什么?我的第一个想法是分配以避免使用=而不是==的错误,但编译器很容易不允许这样做。if(someClass=someValue)//无法将someClass转换为bool。好的,很好if(someClass)//无法将someClass转换为bool。为什么?if(someClass!=null)//更具可读性?我认为假设null意味着false是非常合理的。还有其他语言也使用它,因为它没有我的错误。编辑:我的意思当然是引用类型。DanielEarwicker关于赋值错误的一个很好的评论......这个编译没有警告,因为它评估为bool:boolbool1=false,bool2=true;if(bool1=bool2){//oops...false==true,bool1变为true...}这是C#语言中的一个特定设计特性:if语句只接受bool。IIRC这是为了安全:具体来说,你的第一个if(someClass=someValue)编译失败。编辑:一个好处是它使if(42==i)约定(“yoda比较”)变得不必要。“我认为假设null意味着错误是非常合理的”在C#中不存在。false是一个布尔结构,一种值类型。值类型不能有空值。如果你想做你所做的事情,你必须创建你的类型特定的自定义转换器bool:publicclassMyClass{publicstaticimplicitoperatorbool(MyClassinstance){returninstance!=null;}}有了上面的内容,我可以这样做:if(instance){}等等“我认为假设null意味着错误是非常合理的”我不同意。恕我直言,错误的意思是“不”。Null表示“我不知道”;即完全不确定。在数据类型的实例中想到的一件事,比如int?整数不能为空,所以它们总是评估为真?您可以假设int=0为假,但这开始变得非常复杂,因为0是一个有效值(其中0可能计算为真,因为程序员设置了它)而不仅仅是默认值。在许多边缘情况下,null不是一个选项,或者有时它是一个选项,有时它不是。他们想出了这样的事情来保护程序员不犯错误。这与您不能在案例陈述中这样做的原因相同。只需使用if(Convert.ToBoolean(someClass))http://msdn.microsoft.com/en-us/library/wh2c31dd.aspx参数值类型:System.Object实现IConvertible接口的对象,或者为null。返回值类型:System.Booleantrue或false,反映通过为基础类型的值调用IConvertible.ToBoolean方法返回的值。如果值为null,则该方法返回false据我所知,这是您在动态语言中看到的函数,C#不是(根据语言规范,如果只接受bool或计算结果为bool的表达式)。我认为假设null在所有情况下都是错误的是不合理的。在某些情况下这是有道理的,但在其他情况下则不然。例如,假设您有一个可以具有三个值的标志:set、unset和un-initialized。在这种情况下,set为true,unset为false,un-initialized为null。如您所见,在这种情况下,null并不意味着false。因为null和false是不同的东西。一个完美的例子是布尔值?如果foo的计算结果为真,则FOO的计算结果为真。如果foo为false,它的值为false如果foo没有被赋值,它的值为null。这是三个逻辑上独立的条件。换个角度想:“我欠你多少钱?”“没有”和“我没有那个信息”是两个截然不同的答案。null在条件中不计算为false的原因是什么?我首先考虑赋值以避免使用=而不是==这不是原因的错误。我们知道这一点是因为如果被比较的两个变量恰好是bool类型,代码将顺利编译:boola=...boolb=...if(a=b)Console.WriteLine("Weird,Iexpected他们是不同的");如果b为真,则打印消息(现在a,让后续的调试体验与消息一致,从而更加迷惑你...)null不能转换为bool的原因只是C#避免隐式转换,除非设计者要求用户定义的类型。C++历史书籍中充满了隐式转换带来的痛苦故事。在结构上,大多数“想不出任何技术原因为什么invalid应该等于false”的人都弄错了。代码由CPU运行。大多数(如果不是全部)CPU都有位、位组和位组的解释。也就是说,某物可以是0、一个字节、一个字、一个双字、一个四字等等。请注意,在x86平台上,一个字节是一个八位字节(8位),一个字通常是16位,但这不是必需的。旧的CPU有4位字,即使是今天的低端嵌入式控制器也经常使用7或12位字。也就是说,机器代码中的某些东西是“等于”、“零”、“大于”、“小于”、“大于或等于”或“小于或等于”。没有null、false或true这样的东西。按照约定,true为1,false为0,空指针为0x0000或0x0000000000000000,具体取决于地址总线宽度。C#是例外之一,因为它是间接类型,其中两个可能的值0和1不是立即值,而是结构的索引(想想C中的枚举,或x86汇编中的PTR)。这是设计使然。然而,重要的是要注意此类设计决策是精心设计的,而传统的、直接的方法是假设0、null和false是相等的。C#不像C++那样转换参数。如果您希望if语句接受该值,则需要显式地将值转换为布尔值。它只是c#的类型系统,相对于PHP、Perl等语言而言。条件只接受布尔值,null没有布尔值类型,所以它在那里不起作用。至于你在另一个评论中提到的C/C++中的NULL示例,不得不说C和C++都没有布尔类型(因为C++通常有bool的类型转换,解析为int,但这是另一个问题)和他们也没有空引用,只有NULL(=>0)-指针。当然,编译器设计者可以将任何可空类型自动转换为布尔值,但这会导致其他问题,即:假设foo不为空:if(foo){//dostuff}哪个状态为真?总是如果它不是空的?但是,如果您希望您的类型可转换为布尔值(即来自您的三态或量子逻辑类)怎么办?这意味着您将有两种不同的bool转换,隐式和显式,并且两者的行为不同。我什至无法想象如果你这样做会发生什么if(!!foo)//C中的常见模式以规范化用作布尔值的值,//在这种情况下可能会被滥用以从对象创建布尔值{}i认为coercion(foo==null)很好,因为它还增加了代码的清晰度,使您更容易理解您真正检查的内容。C#学习教程就是这样:为什么null的计算结果不为false?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
