可能我可能会对拳击和拆箱感到困惑。
请考虑MSDN中的以下声明:
“取消装箱是从类型对象到值的显式转换 键入或从接口类型到实现该类型的值类型 接口“。
因此,这意味着取消装箱只能应用于值类型参数。
所以,这没关系。
var concernedInteger = (int)myObject; //unboxing is ok.
由于class是引用类型,因此不起作用(因为取消装箱仅适用于值类型)
var concernedClassObject = (TestClass)testClassObject // unboxing is still ok.
我的ReSharper没有显示任何错误。
所以,我的问题是“当MSDN说只有值类型可以取消装箱时,如何取消装箱引用类型变量?”
答案 0 :(得分:8)
这不是拆箱。它是type casting
。
取消装箱将值从引用输出到值类型(假设转换成功)。当你像这样移动引用类型时......它只是普通的类型转换。
无论如何,拳击和取消装箱都是type casting
的类型。它们被赋予特殊名称(装箱和拆箱)的原因是因为更多的是在托管环境中继续进行而不是仅仅修改了几个查找表。这就是为什么它们被分为值类型的装箱和拆箱术语。但是当它涉及引用类型时......它只是类型转换。
答案 1 :(得分:2)
你在这里做的是TypeCasting
而不是装箱/拆箱。但是,相同的转换语法用于拆箱和显式引用转换
拳击和取消装箱:
当您在引用类型中输入值类型时, Boxing
和unboxing
开始起作用,基本上是对象
一个简单的boxing
和unboxing
示例就像
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 错误。
使用As关键字:
示例
MyClass _MyObject = (MyClass ) obj;
MyClass MyObject = obj as MyClass ;
当第一行代码中的强制转换失败时会抛出异常,而在第二行中只获得 null 值。此外,您只能将用作作为引用类型所以对于值类型,你只能使用普通的转换方法。