6

在 DLR 的 LINQ 表达式中,这之间有什么区别:

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

还有这个:

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

这方面的文档似乎有点粗略。

更重要的是,其中一个等效于此 C# 代码:

(ClassA)InstanceOfClassB

ClassB 在哪里有一个隐式或显式运算符可以转换为 ClassA?

4

4 回答 4

4

Unbox 重要的是它为您提供了装箱值的地址。这确保您可以对未装箱的值调用方法。如果该方法改变了值类型,那么它改变的是盒装版本而不是新副本。如果您只是进行了转换,那么您实际上已经制作了盒装值类型的副本,然后在其上调用方法会改变副本而不是原始值。

于 2009-06-09T20:16:47.233 回答
3

主要区别在于Epression.Unbox仅在将值类型从堆中显式拆箱时才需要。 Expression.Convert是您想用来挂钩到用户定义的转换(无论是隐式还是显式)的方法。

Expression.Convert

如果 expression.Type 或 type 是定义隐式或显式转换运算符的用户定义类型,则MethodInfo表示该运算符的 是实现方法。

并且:

如果 expression.Type 或 type 是引用类型,并且存在从 expression.Type 到 type 的显式装箱、拆箱或引用转换,则实现方法为 null。

于 2009-06-09T17:36:08.953 回答
2

通常,装箱采用值类型并将其包装在对象中。拆箱则相反。您可以将其视为装箱获取寄存器或堆栈值并将其放在堆上,返回指向该值的指针。拆箱将堆上的对象放入寄存器或堆栈帧中。基础数据类型保持不变。

将一种数据类型转换为另一种数据类型。

于 2009-06-09T17:42:15.433 回答
1

Expression.Convert 相当于进行强制转换。

于 2009-06-09T17:39:00.913 回答