为什么不是';这在C#中是不允许的

本文关键字:不允许 为什么不 这在 | 更新日期: 2023-09-27 18:25:15

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

if (param.days != null)

这很好,但如果我说

If (param.days)

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

为什么不是';这在C#中是不允许的

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

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

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

if(param.days.HasValue)

其与CCD_ 5 相同

或者,如果您的类型可以合理地被视为布尔值,那么您可以重写一些运算符来告诉编译器这一点。

C#与C++不同,它不会将integer隐式转换为bool。

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

取自Eric Lippert的帖子";null不是false":

某些语言允许值类型或引用类型的null值,或者两者,被隐含地视为布尔型。

类似地,对于可为null的值类型;在某些语言中,null值类型被隐式地处理为";false";。

C#的设计者考虑了这些特性并拒绝了它们。首先,因为将引用或可为null的值类型视为布尔值是一个令人困惑的习语,也是潜在的大量错误来源。第二,因为从语义上来说,自动翻译似乎有些冒昧null——这应该意味着";该值丢失";或";该值为未知"——至";该值在逻辑上为假";。

这句话涵盖了您的string示例,但没有任何其他类型具有隐式布尔求值。

然而,人们可能会猜测,像整数这样的项目不计算为布尔值的原因也属于一个糟糕的习惯用法或过于武断的旗号。

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

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

考虑If ("Hello World")

《你好世界》是真是假?两者都不是,这是一根绳子。

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

if语句中的比较需要boolean结果。CCD_ 13是CCD_ 14而不是CCD_。C#不隐式地将integer强制转换为bool

您需要将该值与null进行比较,或者使用string.IsNullOrEmpty()来获得boolean结果如果你想这样做,试试这个代码:

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

 if (param.days!=NULL)
 {
 }