动态类型的拆箱
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
类型本身的转换。这避免了一些会导致规范其他地方出现问题的转换循环。)
考虑以下代码:
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 typeT
. 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 toT
. If no conversion is found, a run-time exception is thrown.
(这里有一点细微差别,它是从类型 dynamic
的任何 表达式 的转换,而不是从 dynamic
类型本身的转换。这避免了一些会导致规范其他地方出现问题的转换循环。)