首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# Bug还是脑筋急转弯?Cast仅适用于Coalesce (??)运算符

C# Bug还是脑筋急转弯?Cast仅适用于Coalesce (??)运算符
EN

Stack Overflow用户
提问于 2010-05-27 08:19:18
回答 2查看 287关注 0票数 1

这非常奇怪,也许有人可以解释发生了什么,或者这是一个错误(尽管我倾向于认为这可能只是C#的一些错综复杂的东西)。

下面的代码抛出错误“无法隐式地将类型'uint?‘转换为’uint‘。”:

代码语言:javascript
复制
public void Test(UInt32? p)
{ 
    UInt32 x = p;
}

但是,此代码可以正常工作,并且没有错误:

代码语言:javascript
复制
public void Test(UInt32? p)
{
    UInt32 x = p ?? 1;
}

哈?为什么这是可行的?为什么联合运算符会导致UInt32的隐式转换?(nullable)转换为UInt32 (非nullable),而第一条错误消息指出在这些类型之间没有隐式转换?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-27 08:22:38

这样想吧。

Nullable<T>是一个值类型。显然,它不可能真的为null。因此,表达式如下:

代码语言:javascript
复制
p == null

确实是语法上的糖分:

代码语言:javascript
复制
!p.HasValue

类似地,表达式:

代码语言:javascript
复制
p ?? 1

是语法糖,适用于:

代码语言:javascript
复制
p.HasValue ? p.Value : 1

从前面的内容可以清楚地看出,expression p ?? 1实际上计算结果为uint,这就是代码在没有强制转换的情况下能够正常工作的原因。

票数 11
EN

Stack Overflow用户

发布于 2010-05-27 10:22:38

合并运算符??之所以有效,是因为C#编译器将可空类型的explicit support放在运算符的左侧。正如陶丹解释的那样,很明显,这样的表达式永远不会抛出异常。

看看Nullable<T>类型上的可用运算符,没有一个能让p ?? 1int val = p更合法。它之所以能工作,是因为它是一个编译器特性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2917725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档