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比较")不必要.
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意为"我不知道"; 即完全不确定.
有一点让人想到在数据类型的实例中,比如int?Int不能为空,所以它们总是评估为真吗?你可以假设int = 0是假的,但是开始变得非常复杂,因为0是一个有效值(其中0可能评估为true,因为编程器设置它)而不仅仅是默认值.
有很多边缘情况,其中null不是一个选项,或者有时它是一个选项,有时则不是.
他们提出这样的事情来保护程序员不犯错误.它与你在案例陈述中无法做到的原因相同.
只需使用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