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.
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.
并不是那么明显,null应该是假的.空值表示该值未知或未初始化.不知道该值是真还是假.谁说null应该表现得像假?
一个更明显的用法Nullable<bool>是存储可以是真或假的东西,但有时是不相关或未知的,在这种情况下,值为null.