gpt4 book ai didi

c# - 虚方法的重载解析

转载 作者:行者123 更新时间:2023-11-30 18:41:10 25 4
gpt4 key购买 nike

考虑代码

public class Base
{
public virtual int Add(int a,int b)
{
return a+b;
}
}

public class Derived:Base
{
public override int Add(int a,int b)
{
return a+b;
}

public int Add(float a,float b)
{
return (Int32)(a + b);
}
}

如果我创建 Derived 类的实例并使用 int 类型的参数调用 Add 为什么它调用带有 float 参数的 Add 方法

Derived obj =new Derived()
obj.Add(3,5)

// why this is calling
Add(float a,float b)

为什么不调用更具体的方法?

最佳答案

这是设计使然。 C# 语言规范第 7.5.3 节指出:

For example, the set of candidates for a method invocation does not include methods marked override (§7.4), and methods in a base class are not candidates if any method in a derived class is applicable (§7.6.5.1).

换句话说,因为你的Derived类有一个非重写的Add方法,Base<中的Add方法 类(及其在 Derived 中的覆盖版本)不再是重载解析的候选对象。

尽管 Base.Add(int,int) 会更好,但 Derived.Add(float,float) 的存在意味着基类方法编译器甚至从未考虑过。

Eric Lippert 在 this blog post 中讨论了这种设计的一些原因。 .

关于c# - 虚方法的重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7204015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com