考虑以下代码......
public class ValueHolder<T>
{
public T HeldValue{ get; set; }
}
在这里分配x时,当然没有拳击。
var intValueHolder = new ValueHolder<int>(){ HeldValue = 44 };
int x = intValueHolder.HeldValue;
但是在这种情况下,ValueHolder存储在动态中呢?将HeldValue分配给y时是否有拳击?
dynamic dynamicValueHolder = new ValueHolder<int>(){ HeldValue = 44 };
int y = dynamicValueHolder.HeldValue;
我不确定动态成员解析的机制是什么,所以我不确定如何检查。
注意
我不在动态中存储值类型,所以像这样的例子...
dynamic x = 44; // 44 is boxed
......不是我要问的。在我的示例中,我在动态中存储了一个对象,因此不需要装箱,但是当我访问该对象上的值类型属性时,该值类型属性是否装箱?希望能够清除我在此之后所做的事情。
答案 0 :(得分:0)
我引自this msdn文件:
&#34;在大多数情况下,类型动态类似于类型对象。但是,包含dynamic类型表达式的操作不会被编译器解析或进行类型检查。编译器将有关操作的信息打包在一起,该信息稍后用于评估运行时的操作。作为过程的一部分,dynamic类型的变量被编译为object类型的变量。因此,类型dynamic仅在编译时存在,而不是在运行时存在。 &#34;
所以
dynamic dynamicValueHolder = new ValueHolder<int>(){ HeldValue = 44 };
不会打拳击。
但是动态编译就像对象一样,对象是引用类型。创建引用类型时,它可以包含值类型属性,并且这些属性存储在堆上,因为它们是引用类型的一部分(有关更多信息,请参阅this c-sharpcorner文章。 然后
int y = dynamicValueHolder.HeldValue;
意味着取消装箱。