如果condition param.days是一个字符串,我有以下内容.
if (param.days != null)
Run Code Online (Sandbox Code Playgroud)
这很好,但如果我说
If (param.days)
Run Code Online (Sandbox Code Playgroud)
然后它在运行时没有正确评估.这两个语句在C#中都不一样.
它确实说该值为null但是C#尝试将其强制转换为不可为空的bool.
为什么C#设计师选择这样做?
这样的语句在C++中是有效的,但为什么在C#中这不被认为是有效的?
Mar*_*ell 18
这样的语句在C++中是有效的,但为什么在C#中这不被认为是有效的
因为C#假定了不同的语言规则.它不假设每个数字/引用都可以通过检查它是否为零而非零,null与非null来视为布尔值.如果要测试某些内容是否为null:请测试它是否为null.
注意:如果days实际上是T?(又名Nullable<T>),那么你可以检查:
if(param.days.HasValue)
Run Code Online (Sandbox Code Playgroud)
那就是相同的 if(param.days != null)
或者,如果您的类型可以理智地被视为布尔值,那么您可以覆盖运算符以告诉编译器.
为了澄清,这是在评论中回答问题修正:为什么C#设计者选择不实现null到布尔值,而C++允许它.
取自Eric Lippert的帖子" null is not false ":
某些语言允许将值类型或引用类型的空值或两者都隐式地视为布尔值.
类似于可空值的类型; 在某些语言中,null值类型被隐式地视为"false".
C#的设计者考虑了这些功能并拒绝了它们.首先,因为将引用或可空值类型作为布尔值处理是一个令人困惑的习惯用语和潜在的丰富的错误来源.第二,因为在语义上自动翻译null似乎是冒昧的 - 这应该意味着"这个值缺失"或"这个值是未知的" - "这个值在逻辑上是错误的".
这个特定的句子涵盖了您的string示例,但没有其他类型具有隐式布尔评估.
然而,人们可能会猜测整数没有评估为布尔值等项目的原因也属于成为一个不好的习语或过于放肆的旗帜.
| 归档时间: |
|
| 查看次数: |
338 次 |
| 最近记录: |