You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),可以用以下两种方式:

  1. 将对象强制转换为基类类型:
((AbstractClass)obj).Display(i);

此时编译器会直接调用基类中被重写的方法,输出预期结果。

  1. 在Myclass中显式指定调用基类方法(类内部场景):
public void CallBaseDisplay(int i)
{
    base.Display(i);
}

调用obj.CallBaseDisplay(i)即可触发预期的输出。

内容的提问来源于stack exchange,提问作者Dipali Bhadeliya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:02:38