Convert.ToInt16和(Int16)有什么区别

Co.*_*den 6 c# casting type-conversion

我有一段代码

try
{
  object s = new object();
  s = 10;
  Console.WriteLine("{0}", Convert.ToInt16(s));
  Console.WriteLine("{0}", (Int16)s);
}
catch (InvalidCastException ex)
{
  Console.WriteLine(ex.Message);
  Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

在此基础上,我有很多问题
.1)Convert.ToInt16()和(Int16)都是拆箱操作
2)如果两者都与拆箱有关,那么为什么它们是不同的.因为上面的代码在Console.WriteLine("{0}", (Int16)s);符合行时显示以下错误
错误:
指定的强制转换无效
3)据我所知(Int16)是传统的强制转换并且Convert.ToInt16()是类型安全转换.但是在这里有什么不同呢?也许这是一个愚蠢的问题,但我很困惑.请为我澄清这一点并纠正我错在哪里.

Ant*_*ram 9

数字文字10被视为整数,更具体地说是一个整数Int32.虽然你输入你的变量object,在幕后它仍然是整数.您只能直接将值类型拆分为相同类型或该类型的可空版本.

例如,这段代码:

int i = 10;
object o = i;
short j = (short)o; 
Run Code Online (Sandbox Code Playgroud)

不会执行,因为原始值i不是短,它是一个整数.你必须先将unbox转换为整数,然后才能转换为short.

short j = (short)(int)o;
Run Code Online (Sandbox Code Playgroud)

Convert.ToInt16回避这个问题,它的实现方式是一个实现细节.但是,该方法有多个重载,它们接受多种类型,包括字符串,因此它等同于使用直接强制转换的代码.


编辑:我注意到我在这里混合术语,所以对于新手C#阅读器来说,这是明确的,名称shortInt1616位整数可以互换,名称intInt3232位整数也是如此.在C#,short并且int是用于.NET类型别名Int16Int32分别.