以下是我在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     // I was expecting: Abstract Class Override Display Method`

有人能帮我理解为什么我会得到这个输出吗?

推荐答案

c# language spec, overload resolution

每个上下文都以其独特的方式定义候选函数成员集和参数列表.For instance, the set of candidates for a method invocation does not include methods marked override (§12.5), and methods in a base class are not candidates if any method in a derived class is applicable (§12.8.9.2).

(强调是我的)

这基本上意味着,如果一个方法有两个重载,并且都可以 Select 作为要调用的重载,其中一个重载覆盖了基类中的一个方法,那么该方法将不会被调用.

请注意,只有在调用站点中的参数类型和方法签名中的参数类型之间存在隐式转换时,这才适用.例如,如果你的Display方法是类型string,它就不会被调用:

public abstract class AbstractClass
{
    public virtual void Display(int i)
    {
        Console.WriteLine("Abstract Class Virtual Display Method");
    }
}
public class Myclass : AbstractClass
{
    // This overload would be chosen since int can't be implicitly converted to a string
    public override void Display(int i)
    {
        Console.WriteLine("Abstract Class Override Display Method");
    }

    public void Display(string i)
    {
        Console.WriteLine("Derived Class Normal Display Method");
    }
}

Csharp相关问答推荐

.NET最小API映射将T参数列表为[FromQuery]

如何禁用ASP.NET MVP按钮,以便无法使用开发人员控制台重新启用它

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

如何告诉自己创建的NuGet包在应用程序中发生了变化?

读取配置文件(mytest. exe. config)

自动映射程序在GroupBy之后使用项目

无法通过绑定禁用条目

如何使用EF Core和.NET 8来upsert到具有多对多关系的表?

异步实体框架核心查询引发InvalidOperation异常

DbContext-传递自定义配置选项

在Docker容器中运行API项目时,无法本地浏览到index.html

在字符串C#之前获取数字

如何将%{v_扩展}转换为%{v_扩展}>>

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

WPF动态设置弹出窗口水平偏移

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?

使用postman 测试配置了身份的.NET 6应用程序

在Visual Studio 2022中查找Xamarin模板时遇到问题

使用ImmutableList时,DynamicData未按预期工作