动态类型的拆箱

Unboxing for dynamic type

考虑以下代码:

public class Foo1
{
    public dynamic dowork()
    {
        return 10;
    }        
}

在我的 Main 中,我这样称呼:

int i = new Foo1().dowork();

return值为10。我的问题是为什么这里不需要Unboxing?但是在watch中我已经验证了Return Type of [=16] =] 是 System.Object.

拆箱 - 但它是隐式地进行的。存在从任何 dynamic 表达式到任何类型的隐式转换。执行的确切转换将取决于值的执行时类型。

来自 C# 5 规范的第 6.1.8 节:

An implicit dynamic conversion exists from an expression of type dynamic to any type T. The conversion is dynamically bound (§7.2.2), which means that an implicit conversion will be sought at run-time from the run-time type of the expression to T. If no conversion is found, a run-time exception is thrown.

(这里有一点细微差别,它是从类型 dynamic 的任何 表达式 的转换,而不是从 dynamic 类型本身的转换。这避免了一些会导致规范其他地方出现问题的转换循环。)