繁体   English   中英

C#中的运行时类型与编译时类型

[英]Run-time type vs compile-time type in C#

C#中的运行时类型和编译时类型之间有什么区别?虚拟方法调用有什么含义?

假设我们有两个类AB声明如下:

internal class A
{
    internal virtual void Test() => Console.WriteLine("A.Test()");
}

internal class B : A
{
    internal override void Test() => Console.WriteLine("B.Test()");
}

B继承自A并覆盖方法Test ,该方法将消息输出到控制台。


C#中的运行时类型和编译时类型有什么区别

现在让我们考虑以下声明:

A test = new B();

  • 在编译时:编译器只知道变量testA类型。 他不知道我们实际上是在给他一个B的例子。 因此,编译类型的testA

  • 在运行时:已知test类型为B ,因此运行时类型为B


以及虚拟方法调用存在什么含义

请考虑以下代码语句:

((A)new B()).Test();

我们正在创建一个B实例,将其转换为A并在该对象上调用Test()方法。 编译器类型为A ,运行时类型为B

当编译器想要解析.Test()调用时,他遇到了问题。 因为A.Test()virtual所以编译器不能简单地调用A.Test因为存储的实例可能已经覆盖了该方法。

编译本身无法确定调用A.Test()B.Test() 被调用的方法由运行时确定,而不是由编译器“硬编码”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM