【发布时间】:2013-01-21 16:39:10
【问题描述】:
C# 4.0 规范如下:
当一个虚方法被调用时,实例的运行时类型为 该调用发生的位置决定了实际的方法 要调用的实现。在非虚拟方法调用中, 实例的编译时类型是决定因素。
起初,我认为这与初始化有关。例如,给定两个初始化:
BaseClass bcDerived = new Derived(); 与 BaseClass bcBase = new BaseClass();
以及辅助类中的重载:
public virtual void Method(Derived d)
{
Console.WriteLine("Result = derived called");
}
public virtual void Method(BaseClass d)
{
Console.WriteLine("Result = base called");
}
Method 调用在这种情况下不受virtual 关键字的影响。不管是否标记了virtual,都会调用派生最少的重载。只有在 Derived 类中的override 期间,方法调用才会发生变化。
那么,“运行时类型”和“编译时类型”是什么意思?它们如何影响方法调用?
【问题讨论】:
-
请说明
Method的声明位置和使用方式。 -
@BrianRasmussen - 在 OP 中,这些方法是辅助类的成员。
-
谢谢。在那种情况下,我不确定接受的答案如何与您的问题相匹配,因为它不包含帮助程序类。不过,只要你对答案满意,我就很好。
-
@BrianRasmussen - 起初,我以为他已经在
callvirt指令中回答了这个问题(就像我将苹果与橙子进行比较一样)。我假设我的示例中缺少关键字。经过更多的思考,你是对的......它并没有直接解决这个例子。callvirt指令应该仍然存在于我的示例中,因为我指定了虚拟。我知道我通过测试重载做了一些奇怪的事情。我的目标是完全理解 C# 规范定义。 -
@P.Brian.Mackey 我只是将我的答案改写为更清楚,并直接谈论您所指的内容。这里的问题是您引用的规范部分与您的问题不匹配;)它指的是对具有虚拟与非虚拟的对象的方法调用,而不是参数和参数列表的重载解决方案。
标签: c# language-specifications