C#中同名重写方法与不同参数普通方法调用结果疑惑
为什么调用
Display(int)却执行了Display(object)? 问题描述
我在Visual Studio中运行了以下代码,但输出结果和预期不符:
代码实现
public abstract class AbstractClass { public virtual void Display(int i) { Console.WriteLine("Abstract Class Virtual Display Method"); } } public class Myclass : AbstractClass { public override void Display(int i) { Console.WriteLine("Abstract Class Override Display Method"); } public void Display(object i) { Console.WriteLine("Derived Class Normal Display Method"); } } class MainClass { static void Main(string[] args) { Myclass obj = new Myclass(); int i = 1; obj.Display(i); Console.ReadLine(); } }
实际输出
Derived Class Normal Display Method
预期输出
Abstract Class Override Display Method
原因解析
这是C#方法重载解析规则导致的:
- 当通过
Myclass类型的对象调用方法时,编译器会优先在当前类的成员中查找匹配的重载,只有当前类没有任何可匹配的方法时,才会去基类中查找继承的成员。 - 虽然
int类型和被重写的Display(int)是最精确的匹配,但Myclass中定义的Display(object)属于当前类的成员,int可以通过装箱隐式转换为object,所以编译器会将它作为候选方法,最终选择当前类的Display(object)执行。
验证与解决方法
如果想调用被重写的Display(int),可以用以下两种方式:
- 将对象强制转换为基类类型:
((AbstractClass)obj).Display(i);
此时编译器会直接调用基类中被重写的方法,输出预期结果。
- 在
Myclass中显式指定调用基类方法(类内部场景):
public void CallBaseDisplay(int i) { base.Display(i); }
调用obj.CallBaseDisplay(i)即可触发预期的输出。
内容的提问来源于stack exchange,提问作者Dipali Bhadeliya
相关产品推荐
相关产品推荐

