当访问存储在动态中的对象的值类型属性时,是否会导致对这些属性的值进行装箱?

When accessing value-type properties of an object stored in a dynamic, does it cause boxing of those properties' values?

考虑以下代码...

public class ValueHolder<T>
{
    public T HeldValue{ get; set; }
}

这里给x赋值的时候,当然没有装箱。

var intValueHolder = new ValueHolder<int>(){ HeldValue = 44 };
int x = intValueHolder.HeldValue;

但是在这种情况下,如果 ValueHolder 存储在动态中呢?给 y 赋 HeldValue 时有没有装箱?

dynamic dynamicValueHolder = new ValueHolder<int>(){ HeldValue = 44 };
int y = dynamicValueHolder.HeldValue;

我不确定动态 成员 解析的确切机制是什么,所以我不确定如何检查它。

备注

不是在动态中存储值类型,所以像这样的例子...

dynamic x = 44; // 44 is boxed

...不是我要问的。在我的示例中,我在动态中存储一个对象,因此那里不需要装箱,但是当我随后访问该对象的值类型 属性 时, 那个值类型 属性盒装?希望这能解决我在这里的问题。

我引用自this msdn文档:

" 在大多数情况下,动态类型的行为类似于对象类型。但是,编译器不会解析或检查包含动态类型表达式的操作。编译器将有关操作的信息打包在一起,并且该信息稍后用于评估运行时的操作。作为过程的一部分,动态类型的变量被编译为对象类型的变量。因此,动态类型仅存在于编译时,而不存在于运行时间。”

所以

dynamic dynamicValueHolder = new ValueHolder<int>(){ HeldValue = 44 }; 

不会处理拳击。

但是dynamic是像object一样编译的,object是引用类型。创建引用类型时,它可以包含值类型属性,并且这些属性存储在堆中,因为它们是引用类型的一部分(有关更多信息,请参阅 this c-sharpcorner 文章。 然后

int y = dynamicValueHolder.HeldValue;

表示拆箱。