c#通过对象

时间:2018-10-01 11:06:48

标签: c# casting boxing unboxing

我可以将byte强制转换为int

byte a = 2;
int b = a;      // => unboxing, boxing or conversion?

当我先将byte投射到object之后再投射到int时,我得到InvalidCastException

byte a = 2;
object b = a;    // => boxing?
int c = (int) b; // => unboxing fails?

但是我可以使用Convert.ToInt32解决此问题。

byte a = 2;
object b = a;                // => boxing?
int c = Convert.ToInt32(b);  // => what happens here?

  • 为什么在第二个示例中得到InvalidCastException
  • Convert.ToInt32在后​​台是什么?
  • 我是否正确标记了boxingunboxingconversion? /如果不确定示例中的正确术语是什么?
  • 转换操作员在这里吗?是否有关于基本类型的基本转换运算符的概述?

请不要犹豫,向我暗示其他我可能弄错或错过的事情。

3 个答案:

答案 0 :(得分:5)

  

为什么在第二个示例中得到InvalidCastException

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

  

Convert.ToInt32在后​​台是什么?

This.它使用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
  

这里的转换运算符在起作用吗?是否有关于基本类型的基本转换运算符的概述?

是的,尽管在CLR中定义。

答案 1 :(得分:1)

  

为什么在第二个示例中出现InvalidCastException?

您只能在原始类型中取消装箱

  

Convert.ToInt32在后台有什么作用?

它包含一个转换

  

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

byte a = 2;
int b = a;      // convertation (byte to int)

object b = a;    // boxing
int c = (int) b; //unboxing

object b = a;                // boxing
int c = Convert.ToInt32(b);  // convertation (object to int)
  

这里的转换运算符在起作用吗?是否有关于基本类型的基本转换运算符的概述?

您可以反映框架代码以进一步了解其工作原理。

答案 2 :(得分:-2)

应该是

object b = a;    // => boxing
int c = (int) b;  //Un-boxing