5

param.days如果条件是字符串,我有以下内容。

if (param.days != null)

这很好用,但如果我说

If (param.days)

那么它在运行时不会正确评估。这两个语句在 C# 中是不同的。
它确实说该值为 null 但随后 C# 尝试将其强制转换为不可为 null 的 bool。 为什么 C# 设计者选择这样做? 这样的声明在 C++ 中是有效的,但为什么这在 C# 中不被认为是有效的呢?

4

6 回答 6

18

这样的语句在 C++ 中是有效的,但是为什么这在 C# 中不被认为是有效的

因为 C# 采用不同的语言规则。它不假设每个数字/引用都可以通过检查它是零还是非零、空还是非空来视为布尔值。如果你想测试某个东西是否为 null:测试它是否为 null

注意:如果days实际上是T?(又名Nullable<T>),那么您可以检查:

if(param.days.HasValue)

然后等同于if(param.days != null)

或者,如果您的类型可以明智地被视为布尔值,那么您可以覆盖一些运算符来告诉编译器。

于 2013-07-29T10:51:21.430 回答
6

C# 与 C++ 不同,不会将整数隐式转换为布尔值。

于 2013-07-29T10:52:52.123 回答
5

为了澄清,这是回答评论中的问题修正:为什么 C# 设计者选择不实现 null 到布尔评估,而 C++ 允许它。

取自 Eric Lippert 的帖子“ null is not false ”:

某些语言允许将值类型或引用类型或两者的空值隐式视为布尔值。

同样对于可空值类型;在某些语言中,空值类型被隐式视为“假”。

C# 的设计者考虑了这些特性并拒绝了它们。首先,因为将引用或可空值类型视为布尔值是一个令人困惑的习惯用法,并且可能是大量错误的来源。其次,因为从语义上讲,将 null (应该表示“此值丢失”或“此值未知”)自动翻译为“此值在逻辑上为假”似乎是冒昧的。

这个特定的句子涵盖了您的string示例,但没有其他类型具有隐式布尔评估。

然而,人们可能会推测诸如整数之类的项目不评估为布尔值的原因也属于一种糟糕的习惯用法或过于自以为是。

于 2013-07-29T11:09:43.407 回答
1

在 C# 中,该If语句要求括号的内容是布尔表达式。

考虑If ("Hello World")

“Hello World”是真的还是假的?两者都不是,它是一个字符串。

您可能需要考虑一个 LINQ 表达式.Any(),例如,If (myListOfCats.Any())因为您的 .days 属性意味着一个对象集合。

于 2013-07-29T10:51:27.700 回答
1

if 语句中的比较需要评估为布尔结果。param.days 不是布尔值。您需要将该值与 null 进行比较以获得布尔结果。C# 是类型安全的。

于 2013-07-29T10:52:02.457 回答
1

语句中的比较if需要一个boolean结果。param.days不是string 一个boolean。C# 不会隐式integer转换为bool.

您需要将该值与 null 进行比较或用于string.IsNullOrEmpty()获取boolean结果如果您想这样做,请尝试以下代码:

 if (!string.IsNullOrEmpty(param.days))
 {
 } 

或者

 if (param.days!=NULL)
 {
 } 
于 2013-07-29T11:08:48.663 回答