6

在DLR的LINQ表达式,也正是这一区别:转换和拆箱有什么区别?

Expression.Convert(SomeVariableExpression, typeof(T)); 

这:

Expression.Unbox(SomeVariableExpression, typeof(T)); 

这个文档似乎有点粗略。

而且更重要的是,这其中的一个就相当于这个C#代码:

(ClassA)InstanceOfClassB 

ClassB的地方有一个隐性或显性的运营商转换为ClassA的?

+1

对不起,这是双张贴。我已经删除了另一个。 :-) – 2009-06-09 17:33:32

+0

见[这个问题](http://stackoverflow.com/q/32158399/1127114),用于当它是需要使用的,而不是转换的Unbox的一个具体例子。 – 2015-08-23 20:45:31

回答

3

井主要区别在于Epression.Unbox只需要一个值的明确的取消装箱键入断堆。 Expression.Convert是您希望用于挂接到用户定义转换(无论是隐式还是显式)的方法。

参见Expression.Convert

如果任expression.Type或类型是 ,其限定 隐式或显式转换 操作者一个用户定义的类型,这MethodInfo 表示操作者是 实现方法。

和也:

如果任expression.Type或类型是 引用类型和明确的拳击, 拆箱,或引用转换 从expression.Type存在打字, 各执行方法是 null。

1

Expression.Convert是在做类型转换的等价物。

2

一般而言,拳击取值类型并把它封装在一个对象。拆箱正好相反。你可以认为这是因为装箱需要一个寄存器或栈值,并将其放在堆上,并返回一个指向该值的指针。拆箱需要堆上的对象并将其放入寄存器或堆栈框架中。基础数据类型保持不变。

转换改变一个数据类型到另一个。

4

重要的是拆箱,它给你的装箱值的地址。这可确保您可以调用取消装箱值的方法。如果该方法突变了值类型,那么它会改变盒装版本而不是新副本。如果你只是做了转换,那么你实际上已经制作了盒装值类型的副本,然后调用它的方法会改变副本而不是原始值。