如果条件可以为空

gdo*_*ica 7 .net c# compiler-construction nullable

Nullable<T>像这样的语法糖有很多:

int? parsed to Nullable<int>

int? x = null
   if (x != null) // Parsed to if (x.HasValue)

x = 56; // Parsed to x.Value = 56;
Run Code Online (Sandbox Code Playgroud)

和更多.

为什么if使用Nullable条件不起作用?

if (x)
{} 
Run Code Online (Sandbox Code Playgroud)

它得到Complier错误,说无法转换Nullable<bool>bool.
为什么它没有被解析if (x.HasValue && x.Value == true)或类似的东西?

这是最明显的用法 Nullable<bool>

Eri*_*ert 23

这是最明显的用法 Nullable<bool>

你的"明显"行为导致许多不明显的行为.

如果

if(x)
Run Code Online (Sandbox Code Playgroud)

当x为null时,被视为false,那么应该发生什么

if(!x)
Run Code Online (Sandbox Code Playgroud)

!x当x为null时,它也为null,因此也将被视为false!你不能用反转反转条件的行为似乎并不奇怪吗?

关于什么

if (x | !x)
Run Code Online (Sandbox Code Playgroud)

当然应该总是如此,但如果x为null,则整个表达式为null,因此为false.

最好通过简单地将它们全部视为非法来避免这些不明显的情况.C#是"让用户明确表达他们的意思"语言.

我相信VB有你想要的行为.如果这是你喜欢的东西,你可以考虑切换到VB.

  • @BluE:您可以自由地不同意我的陈述,但它是对C#规则的正确描述.如果您认为C#的规则设计得很糟糕,那么您可以自由地发表这种观点; 尝试设计自己喜欢的规则的语言! (2认同)

Jon*_*eet 12

简单地说,它无法编译,因为规范说应该 - if条件需要布尔表达式 - 并且类型的表达式 Nullable<bool>不是布尔表达式:

布尔表达式是产生bool类型的结果的表达式; 直接或通过在下面指定的某些上下文中应用operator true.

但是,它很容易解决:

if (x.GetValueOrDefault())
{
}
Run Code Online (Sandbox Code Playgroud)

或者可能更清楚:

if (x ?? false)
{
}
Run Code Online (Sandbox Code Playgroud)

后一种方法很有用,因为它意味着只要将其更改x为null,就可以轻松更改行为x ?? true.


Ily*_*gan 5

并不是那么明显,null应该是假的.空值表示该值未知或未初始化.不知道该值是真还是假.谁说null应该表现得像假?

一个更明显的用法Nullable<bool>是存储可以是真或假的东西,但有时是不相关或未知的,在这种情况下,值为null.