gpt4 book ai didi

c# - 编译时和运行时转换 c#

转载 作者:可可西里 更新时间:2023-11-01 02:59:51 24 4
gpt4 key购买 nike

我想知道为什么在编译时检查 C# 中的某些强制转换,而在其他情况下,责任被推给了 CLR。像上面一样,两者都是不正确的,但处理方式不同。

class Base { }
class Derived : Base { }
class Other { }

static void Main(string[] args)
{
Derived d = (Derived)new Base(); //Runtime InvalidCastException
Derived d = (Derived)new Other(); //Compile-time Cannot convert type...
}

在阅读“深入了解 C#” 时,我找到了有关此主题的信息,其中作者说:
“如果编译器发现该转换实际上不可能工作,它将触发编译错误——如果理论上允许但实际上在执行时不正确,CLR 将抛出异常。”

“理论上”是指通过继承层次结构连接(对象之间的另一种亲和性?)还是编译器的内部业务?

最佳答案

  • 可以在编译时检查向上转型——类型系统保证转型成功。
  • 不能(通常)在编译时检查向下转型,因此它们总是在运行时检查。
  • 不相关的类型不能相互转换。

编译器只考虑静态类型。运行时检查动态(运行时)类型。查看您的示例:

Other x = new Other();
Derived d = (Derived)x;

x 的静态类型是Other。这与 Derived 无关,因此转换在编译时失败。

Base x = new Base();
Derived d = (Derived)x;

x 的静态类型现在是 BaseBase 类型的内容可能 具有动态类型Derived,因此这是一个沮丧的类型。一般来说,如果运行时类型是 BaseDerived,编译器无法从 x 的静态类型中获知基础。因此,是否允许转换的决定留给了运行时。

关于c# - 编译时和运行时转换 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4499528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com