c#通过对象取消装箱

NtF*_*reX 3 c# boxing unboxing casting

我可以投byteint没有任何问题.

byte a = 2;
int b = a;      // => unboxing, boxing or conversion?
Run Code Online (Sandbox Code Playgroud)

当我byte先施展object,然后int我得到一个InvalidCastException.

byte a = 2;
object b = a;    // => boxing?
int c = (int) b; // => unboxing fails?
Run Code Online (Sandbox Code Playgroud)

但我可以通过使用来解决这个问题Convert.ToInt32.

byte a = 2;
object b = a;                // => boxing?
int c = Convert.ToInt32(b);  // => what happens here?
Run Code Online (Sandbox Code Playgroud)
  • 为什么我InvalidCastException在第二个例子中得到一个?
  • 这是什么Convert.ToInt32背景?
  • 难道我的标签boxing,unboxingconversion正确?/在我不确定的例子中,正确的术语是什么?
  • 转换运营商是否在这里发挥作用?是否概述了基本类型的基本转换运算符?

请不要犹豫,提示我其他可能错误或遗漏的事情.

Pat*_*man 5

为什么我InvalidCastException在第二个例子中得到一个?

因为您指定要将(盒装)变量的类型(同时取消框)转换为其他类型.并且没有定义内置,隐式或显式转换运算符,因此它失败了.

这是什么Convert.ToInt32背景?

这个.它使用IConvertible接口进行转换.

我是否正确标记了装箱,拆箱和转换?/在我不确定的例子中,正确的术语是什么?

int b = a;      // => conversion
object b = a;    // => boxing
int c = (int) b; // => casting fails
int c = Convert.ToInt32(b);  // => what happens here: a method call that happens to do a conversion
Run Code Online (Sandbox Code Playgroud)

转换运营商是否在这里发挥作用?是否概述了基本类型的基本转换运算符?

是的,虽然在CLR中定义.