C#Bug还是Brain Teaser?仅使用Coalesce(??)运算符进行转换

Ale*_*lex 1 .net c# casting

这很奇怪,也许有人可以解释发生了什么,或者这是一个错误(尽管我倾向于认为这可能只是关于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,这就是代码在没有强制转换的情况下工作的原因.