这很奇怪,也许有人可以解释发生了什么,或者这是一个错误(尽管我倾向于认为这可能只是关于C#的错综复杂的东西).
以下代码抛出错误"无法隐式转换类型'uint?' 'uint'.":
public void Test(UInt32? p)
{
UInt32 x = p;
}
Run Code Online (Sandbox Code Playgroud)
但是,此代码可以正常运行:
public void Test(UInt32? p)
{
UInt32 x = p ?? 1;
}
Run Code Online (Sandbox Code Playgroud)
咦?为什么这样做?为什么coalesce运算符会导致UInt32的隐式转换?(可为空)到UInt32(不可为空),而第一条错误消息表明这些类型之间没有隐式转换?
Dan*_*Tao 11
这样想吧.
Nullable<T>是一种值类型.显然,它实际上不能为空.因此,表达式:
p == null
Run Code Online (Sandbox Code Playgroud)
这真的是语法糖:
!p.HasValue
Run Code Online (Sandbox Code Playgroud)
同样,表达式:
p ?? 1
Run Code Online (Sandbox Code Playgroud)
语法糖是:
p.HasValue ? p.Value : 1
Run Code Online (Sandbox Code Playgroud)
从前面的内容可以看出,表达式 p ?? 1实际上是在评估a uint,这就是代码在没有强制转换的情况下工作的原因.