转换和拆箱有什么区别?

发布于 2024-07-24 01:43:54 字数 397 浏览 4 评论 0原文

之间有什么区别?

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

在 DLR 的 LINQ 表达式中,this:和 this:

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

有关此的文档似乎有点粗略。

更重要的是,其中哪一个相当于以下 C# 代码:

(ClassA)InstanceOfClassB

Where ClassB has animplicit orexplicit Operator to cast to ClassA?

In the DLR's LINQ Expressions, what is the difference between this:

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

and this:

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

The documentation on this seems a bit sketchy.

And more to the point, which one of these is equivalent to this C# code:

(ClassA)InstanceOfClassB

Where ClassB has an implicit or explicit operator to cast to ClassA?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

最后的乘客 2024-07-31 01:43:54

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

The important thing Unbox is that it gives you the address of the boxed value. This ensures that you can call a method on the unboxed value. If that method mutates the value type then it's mutating the boxed version instead of a new copy. If you merely did Convert then you'd actually have made a copy of the boxed value type and then calling a method on it would mutate the copy and not the original value.

遥远的她 2024-07-31 01:43:54

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

请参阅Expression.Convert

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

并且:

如果表达式.Type 或 type 是
引用类型和显式装箱,
拆箱或引用转换
从表达式中存在。类型到类型,
实现方法是
空。

Well the main difference is that Epression.Unbox is only needed for explicit unboxing of a value type off the heap. Expression.Convert is the method you would want to use to hook into a user-defined conversion (whether implicit or explicit).

See Expression.Convert:

If either expression.Type or type is
a user-defined type that defines an
implicit or explicit conversion
operator, the MethodInfo that
represents that operator is the
implementing method.

and also:

If either expression.Type or type is a
reference type and an explicit boxing,
unboxing, or reference conversion
exists from expression.Type to type,
the implementing method is
null.

晨曦慕雪 2024-07-31 01:43:54

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

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

In general, boxing takes a value type and wraps it in an object. Unboxing does the reverse. You can think of this as boxing takes a register or stack value and puts it on the heap, returning a pointer to that value. Unboxing takes an object on the heap and puts it into a register or stack frame. The underlying datatype stays the same.

Convert changes one datatype into another.

谁与争疯 2024-07-31 01:43:54

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

Expression.Convert is the equivalent of doing a cast.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文