[英]Run-time type vs compile-time type in C#
C#中的运行时类型和编译时类型之间有什么区别?虚拟方法调用有什么含义?
假设我们有两个类A
和B
声明如下:
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();
在编译时:编译器只知道变量test
是A
类型。 他不知道我们实际上是在给他一个B
的例子。 因此,编译类型的test
是A
在运行时:已知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.