拆箱动态类型

时间:2015-07-28 12:12:00

标签: .net c#-4.0 clr value-type

请考虑以下代码:

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

在我的Main中,我称之为:

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

返回值为10.我的问题是为什么此处不需要Unboxing?但在watch我已验证Return Type的{​​{1}}为{{1} }}

1 个答案:

答案 0 :(得分:2)

取消装箱 - 但它是隐式执行的。从任何dynamic表达式到任何类型的隐式转换。执行的确切转换将取决于值的执行时间类型。

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

  

从类型dynamic的表达式到任何类型T存在隐式动态转换。转换是动态绑定的(第7.2.2节),这意味着将在运行时从表达式的运行时类型到T寻找隐式转换。如果未找到转换,则抛出运行时异常。

(这里有一点点细微之处在于它是来自dynamic类型的任何表达式的转换,而不是来自dynamic类型本身的转换。这避免了一些转换循环这会导致规范中的其他问题。)