0

可能我可能对装箱和拆箱感到困惑。

考虑 MSDN 中的以下声明:

“拆箱是从类型对象到值类型或从接口类型到实现接口的值类型的显式转换。”

因此,这意味着拆箱只能应用于值类型参数。

所以,这没关系。

var concernedInteger = (int)myObject; //unboxing is ok.

由于类是引用类型,这应该不起作用(因为拆箱仅适用于值类型)

var concernedClassObject = (TestClass)testClassObject // unboxing is still ok.

我的 ReSharper 没有显示任何错误。

所以,我的问题是“当 MSDN 说只有值类型可以拆箱时,你如何拆箱引用类型变量”?

4

2 回答 2

8

这不是开箱。它是type casting

拆箱是将引用中的值拉出到值类型中(假设强制转换成功)。当您像那样移动引用类型时..这只是正常的类型转换。

装箱和拆箱都是两种类型type casting。它们被赋予特殊名称(装箱和拆箱)的原因是因为在托管环境中进行了更多操作,而不仅仅是更改了几个查找表。这就是为什么它们被分为值类型的装箱和拆箱这两个术语。但是当涉及到引用类型时......它只是类型转换。

于 2013-09-03T06:21:13.677 回答
2

你在这里做的TypeCasting不是装箱/拆箱。然而,相同的转换语法用于拆箱和显式引用转换

装箱和拆箱:

Boxingunboxing在您将值类型转换为引用类型(基本上是对象)时发挥作用

一个简单boxingunboxing例子就像

             int i=1;
             object o=i; /// This is boxing
             int j = (int)o; /// This is unboxing

类型转换:

类型转换会导致转换。类型转换将表达式显式转换为给定类型。

(type) expression

转换expression为 类型的对象type。让我们考虑示例

 long _longval = 1;
 int i = (int)_longval

显式转换实际上告诉编译器我们知道可能的信息丢失,但我们仍然需要执行转换。这对于内置数字类型是可以的,但在引用类型中它可能完全不兼容。例如

  string _mystring="abc";
  int i=(int)_mystring;

这样的转换表达式将成功编译,但它们将在运行时失败并给出InvalidCastException 错误。

使用关键字:

例子

  MyClass _MyObject = (MyClass ) obj;
  MyClass MyObject = obj as MyClass ;

当转换在第一行代码失败时,会引发异常,而在第二行中,您只会得到空值。此外,您只能将as用于引用类型,因此对于值类型,您必须仅使用正常的转换方法。

于 2013-09-03T06:30:18.550 回答