【问题标题】:C# Bug or Brain Teaser? Cast working only with Coalesce (??) OperatorC# Bug 还是脑筋急转弯? Cast 仅与 Coalesce (??) 运算符一起使用
【发布时间】:2010-05-27 10:22:38
【问题描述】:

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

以下代码抛出错误“无法隐式转换类型'uint?'到'uint'。”:

public void Test(UInt32? p)
{ 
    UInt32 x = p;
}

但是,此代码可以正常工作:

public void Test(UInt32? p)
{
    UInt32 x = p ?? 1;
}

嗯?为什么这行得通?为什么合并运算符会导致 UInt32 的隐式转换? (可为空)到 UInt32(不可为空),而第一条错误消息说这些类型之间没有隐式转换?

【问题讨论】:

    标签: c# .net casting


    【解决方案1】:

    这样想。

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

    p == null
    

    真的是语法糖:

    !p.HasValue
    

    同理,表达式:

    p ?? 1
    

    是语法糖:

    p.HasValue ? p.Value : 1
    

    从前面可以清楚地看出,表达式 p ?? 1 实际上是在计算uint,这就是代码在没有强制转换的情况下工作的原因。

    【讨论】:

    • 解释得很好。完全有道理。
    【解决方案2】:

    合并运算符 ?? 有效,因为 C# 编译器将 explicit support 用于可空类型位于运算符的左侧。正如丹涛解释的那样,显然这样的表达式永远不会抛出异常。

    查看Nullable<T> 类型的可用运算符,没有任何一个运算符可以使p ?? 1int val = p 更合法。它之所以有效,是因为它是一个编译器功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-04
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      相关资源
      最近更新 更多