c# - 为什么强制转换操作在情况 1 中失败但在情况 2 中成功?

标签 c#

情况 1 产生类型不匹配异常。案例 2 按预期工作。有谁知道为什么?还是将作为对象的 Int32 转换为 Int16 的更好方法?

案例一:

var i = (Int16)(object)Int32.Parse("1");

案例二:

var i = (Int16)Int32.Parse("1");

最佳答案

根本原因是在 C# 中显式转换运算符有两种不同的含义:

  • representation-preserving 的意思是:“我知道这个对象总是类型 T,即使编译器无法静态地证明它 - 请让我将它用作 T 而不是更多的东西一般的”。
  • representation-changing 的意思是:“我知道这个对象不是类型的 T,但是有一个转换可以把它变成 T,我会喜欢要执行的转换”。

所以你得到两种不同行为的原因是你分别使用了上述每个不同的含义:

  • 你的第一个片段说:“我知道这个对象 绝对是一个盒装的Int16,我想这样使用它”。但由于它实际上是一个装箱的 Int32,您会得到一个类型不匹配异常。
  • 您的第二个片段说:“我知道这个 Int32 绝对不是 Int16,但我想将它转换为一个”。

换句话说,仅当您尝试拆箱为原始类型时,拆箱才有效。 According to Eric Lippert ,原因在于以一种可以在单个操作中拆箱和转换的方式实现它实在是太不切实际了。

关于c# - 为什么强制转换操作在情况 1 中失败但在情况 2 中成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37325650/

相关文章:

javascript - 使用负值 Google Chart 在条形图上移动注释

c# - IIS7、RewritePath 和 IIS 日志文件

c# - 我如何解析json?

如果隐藏表单有未保存的更改,c# 取消应用程序关闭

c# - 不使用 saveChanges 更新 DBSet

c# - Azure 文档数据库更新文档

c# - 任务中的 System.Windows.Forms.dll 中出现“System.InvalidOperationException”

c# - C# 中的 RSA 实现

c# - 我如何创建一个矩形数组的数组 C#

c# - 如何使用 MciSendString 在 C# 中选择用于录制的音频设备