在DLR的LINQ表达式中,有什么区别:
Expression.Convert(SomeVariableExpression, typeof(T));
和此:
Expression.Unbox(SomeVariableExpression, typeof(T));
关于此的文档似乎有点粗略。
更重要的是,其中一个等同于这个C#代码:
(ClassA)InstanceOfClassB
哪里ClassB有一个隐式或显式运算符可以转换为ClassA?
答案 0 :(得分:4)
重要的是Unbox是它为您提供盒装值的地址。这可确保您可以在未装箱的值上调用方法。如果该方法改变了值类型,那么它会改变盒装版本而不是新版本。如果您只是转换了那么您实际上已经制作了盒装值类型的副本,然后调用它上面的方法会改变副本而不是原始值。
答案 1 :(得分:3)
主要区别在于Epression.Unbox
只需要从堆中显式取消装箱值类型。 Expression.Convert
是您希望用于挂钩到用户定义的转换(无论是隐式还是显式)的方法。
如果是expression.Type或type,则为 用户定义的类型,用于定义 隐式或显式转换 运算符,
MethodInfo
那个 表示运算符是 实施方法。
还有:
如果expression.Type或type是a 引用类型和明确的拳击, 取消装箱或参考转换 从expression.Type到type, 实施方法是 空。
答案 2 :(得分:2)
通常,boxing会获取值类型并将其包装在对象中。拆箱反之亦然。您可以将此视为拳击占用寄存器或堆栈值并将其放在堆上,返回指向该值的指针。取消装箱会在堆上获取一个对象并将其放入寄存器或堆栈帧中。基础数据类型保持不变。
转换将一种数据类型更改为另一种数据类型。
答案 3 :(得分:1)
Expression.Convert相当于做一个演员。