这非常奇怪,也许有人可以解释发生了什么,或者这是一个错误(尽管我倾向于认为这可能只是C#的一些错综复杂的东西)。
下面的代码抛出错误“无法隐式地将类型'uint?‘转换为’uint‘。”:
public void Test(UInt32? p)
{
UInt32 x = p;
}但是,此代码可以正常工作,并且没有错误:
public void Test(UInt32? p)
{
UInt32 x = p ?? 1;
}哈?为什么这是可行的?为什么联合运算符会导致UInt32的隐式转换?(nullable)转换为UInt32 (非nullable),而第一条错误消息指出在这些类型之间没有隐式转换?
发布于 2010-05-27 08:22:38
这样想吧。
Nullable<T>是一个值类型。显然,它不可能真的为null。因此,表达式如下:
p == null确实是语法上的糖分:
!p.HasValue类似地,表达式:
p ?? 1是语法糖,适用于:
p.HasValue ? p.Value : 1从前面的内容可以清楚地看出,expression p ?? 1实际上计算结果为uint,这就是代码在没有强制转换的情况下能够正常工作的原因。
发布于 2010-05-27 10:22:38
合并运算符??之所以有效,是因为C#编译器将可空类型的explicit support放在运算符的左侧。正如陶丹解释的那样,很明显,这样的表达式永远不会抛出异常。
看看Nullable<T>类型上的可用运算符,没有一个能让p ?? 1比int val = p更合法。它之所以能工作,是因为它是一个编译器特性。
https://stackoverflow.com/questions/2917725
复制相似问题