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

标签 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();
}

在此基础上我有很多问题..
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# 读者来说很清楚,名称 shortInt16 对于 16 位整数可以互换,名称 intInt32 对于 32 位整数也是如此。在 C# 中,shortint 分别是 .NET 类型 Int16Int32 的别名。

关于c# - Convert.ToInt16 和 (Int16) 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24027924/

相关文章:

c# - 在 C# 中将委托(delegate)转换为通用委托(delegate)

database - 如何将数据框保存为列表的元素,反之亦然?

c++ - 模板转换运算符问题

string - 如何在 String、&str、Vec<u8> 和 &[u8] 之间进行转换?

c# - .NET Core 使用 IdentityUser 创建不可为 null 的 FK 约束

c# - 使用.NET将多个ogg vorbis文件顺序连接到一个文件中?

c# - 奇怪的委托(delegate)引用行为

c# - 从 WinForms 中的项目文件夹获取图像路径

java - 将具体集合类型转换到其接口(interface)的性能成本

generics - 有理数对象的整数输入的通用构造函数