我有以下一段代码
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();
}
在此基础上我有很多问题..
1) Convert.ToInt16()和(Int16)是否都是拆箱操作
2)如果两者都与拆箱有关,那么为什么它们不同。因为上面的代码在编译Console.WriteLine("{0}", (Int16)s);
行时出现了如下错误
错误:
指定的转换无效
3) 据我所知,(Int16)
是常规转换,Convert.ToInt16()
是类型安全转换。但是,是什么让这些在这里有所不同呢?
也许这是一个愚蠢的问题,但我很困惑。请为我澄清这一点并纠正我的错误。
最佳答案
数字文字 10
被视为整数,更具体地说是 Int32
。虽然您将变量键入为 object
,但在幕后它仍然是整数。您只能将值类型直接取消装箱为其相同类型或该类型的可空版本。
例如这段代码:
int i = 10;
object o = i;
short j = (short)o;
不会执行,因为i
的原始值不是short,是整数。您必须先拆箱为整数,然后才能转换为短整数。
short j = (short)(int)o;
Convert.ToInt16
回避了这个问题,它的方式是实现细节。但是,该方法有多个重载,可以接受多种类型,包括字符串,因此它不等同于使用直接转换的代码。
编辑:我注意到我在这里混淆了术语,所以对于新手 C# 读者来说很清楚,名称 short
和 Int16
对于 16 位整数可以互换,名称 int
和 Int32
对于 32 位整数也是如此。在 C# 中,short
和 int
分别是 .NET 类型 Int16
和 Int32
的别名。
关于c# - Convert.ToInt16 和 (Int16) 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24027924/