在 DLR 的 LINQ 表达式中,这之间有什么区别:
Expression.Convert(SomeVariableExpression, typeof(T));
还有这个:
Expression.Unbox(SomeVariableExpression, typeof(T));
这方面的文档似乎有点粗略。
更重要的是,其中一个等效于此 C# 代码:
(ClassA)InstanceOfClassB
ClassB 在哪里有一个隐式或显式运算符可以转换为 ClassA?
在 DLR 的 LINQ 表达式中,这之间有什么区别:
Expression.Convert(SomeVariableExpression, typeof(T));
还有这个:
Expression.Unbox(SomeVariableExpression, typeof(T));
这方面的文档似乎有点粗略。
更重要的是,其中一个等效于此 C# 代码:
(ClassA)InstanceOfClassB
ClassB 在哪里有一个隐式或显式运算符可以转换为 ClassA?
Unbox 重要的是它为您提供了装箱值的地址。这确保您可以对未装箱的值调用方法。如果该方法改变了值类型,那么它改变的是盒装版本而不是新副本。如果您只是进行了转换,那么您实际上已经制作了盒装值类型的副本,然后在其上调用方法会改变副本而不是原始值。
主要区别在于Epression.Unbox仅在将值类型从堆中显式拆箱时才需要。 Expression.Convert是您想用来挂钩到用户定义的转换(无论是隐式还是显式)的方法。
如果 expression.Type 或 type 是定义隐式或显式转换运算符的用户定义类型,则
MethodInfo表示该运算符的 是实现方法。
并且:
如果 expression.Type 或 type 是引用类型,并且存在从 expression.Type 到 type 的显式装箱、拆箱或引用转换,则实现方法为 null。
通常,装箱采用值类型并将其包装在对象中。拆箱则相反。您可以将其视为装箱获取寄存器或堆栈值并将其放在堆上,返回指向该值的指针。拆箱将堆上的对象放入寄存器或堆栈帧中。基础数据类型保持不变。
将一种数据类型转换为另一种数据类型。
Expression.Convert 相当于进行强制转换。