如果条件param.days
是字符串,我有以下内容。
if (param.days != null)
这很好,但如果我说
If (param.days)
然后它在运行时没有正确评估。这两个陈述在C#中都不一样 确实说该值为null但是C#尝试将其强制转换为不可为空的bool。 为什么C#设计师选择这样做? 这样的语句在C ++中是有效的,但为什么在C#中这不被认为有效?
答案 0 :(得分:18)
这样的声明在C ++中是有效的,但为什么在C#
中这不被认为是有效的
因为C#假定了不同的语言规则。它不假设每个数字/引用都可以通过检查它是否为零而非零,null与非null来视为布尔值。如果要测试某些内容是否为null:测试它是否为null 。
注意:如果days
实际上是T?
(又名Nullable<T>
),那么您可以查看:
if(param.days.HasValue)
然后与if(param.days != null)
或者,如果您的类型可以明智地被视为布尔值,那么您可以覆盖运算符以告诉编译器。
答案 1 :(得分:6)
C#与C ++不同,不会隐式地将整数转换为bool。
答案 2 :(得分:5)
为了澄清,这是在评论中回答问题修正:为什么C#设计者选择不对布尔评估实现null,而C ++允许它。
摘自Eric Lippert的帖子“null is not false”:
某些语言允许值类型或引用类型的空值,或 两者都被隐含地视为布尔人。
类似于可空值的类型;在某些语言中为空值 type被隐式地视为“false”。
C#的设计者考虑了这些功能并拒绝了它们。 首先,因为将引用或可空值类型视为布尔值 是一个令人困惑的成语和潜在的丰富的bug来源。第二, 因为语义上自动翻译似乎很冒昧 null - 应该表示“此值缺失”或“此值为 未知“ - 到”这个值在逻辑上是错误的。“
这个特殊的句子涵盖了你的string
例子,但没有其他类型的隐式布尔评估。
然而,人们可能会猜测整数没有评估为布尔值等项目的原因也属于成语不好或过于冒昧的旗帜。
答案 3 :(得分:1)
在C#中,If
语句要求分析符的内容为布尔表达式。
考虑If ("Hello World")
。
“Hello World”是真还是假?它不是,它是一个字符串。
您可能需要考虑LINQ表达式,例如.Any()
,If (myListOfCats.Any())
,因为.days属性表示对象集合。
答案 4 :(得分:1)
if语句中的比较需要求值为布尔结果。 param.days不是布尔值。您需要将值与null进行比较以获得布尔结果。 C#是类型安全的。
答案 5 :(得分:1)
if
语句中的比较需要boolean
结果。 param.days
string
不是boolean
。 C#不会隐式地将integer
强制转换为bool
。
您需要将该值与null进行比较,或使用string.IsNullOrEmpty()
获取boolean
结果
如果您想这样做,请尝试以下代码:
if (!string.IsNullOrEmpty(param.days))
{
}
OR
if (param.days!=NULL)
{
}