c# - 为什么 f(double) 对于 f(long) 比 f(long, int=0) 更匹配?

标签 c#

我的一位同事发现了这个奇怪的案例。我在这里发布一个简单的例子:

using System;

namespace Test
{
    public class F
    {
        public void f(double d) { Console.WriteLine("public void F.f(double d)"); }
        public virtual void f(long l, int q = 0) { Console.WriteLine("public virtual void F.f(long l, int q = 0)"); }
    }

    public class FDerived : F
    {
        public override void f(long l, int q) { Console.WriteLine("public override FDerived.f(long l, int q)"); }
        public void g() { f(2L); }
    }

    public class G : FDerived
    {
        public void h1() { F fd = new FDerived(); fd.f(2L); }
        public void h2() { FDerived fd = new FDerived(); fd.f(2L); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new FDerived().g();
            new G().h1();
            new G().h2();
            Console.ReadLine();
        }
    }
}

例子的输出是:

public void F.f(double d)
public override FDerived.f(long l, int q)
public void F.f(double d)

我不明白这有什么意义。

为什么对于 f(long),f(double) 比 f(long, int=0) 更匹配?为什么它取决于“fd”的类型?!

最佳答案

我这里没有 C# 规范,但是可选参数值不会被覆盖的方法继承。

尝试更改 FDerived

public override void f(long l, int q)

public override void f(long l, int q = 0)

它会按预期工作。

请注意,这可以在一个简单的示例中显示:

public class F
{
    public virtual void f(long l, int q = 0) { Console.WriteLine("public virtual void F.f(long l, int q = 0)"); }
}

public class FDerived : F
{
    public override void f(long l, int q) { Console.WriteLine("public override FDerived.f(long l, int q)"); }
}

// Doesn't compile: No overload for method 'f' takes 1 arguments
new FDerived().f(5L);

显然这确实编译:

new F().f(5L);

甚至这个:

F obj = new FDerived();
obj.f(5L);

(这个会输出public override FDerived.f(long l, int q))

关于c# - 为什么 f(double) 对于 f(long) 比 f(long, int=0) 更匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30503277/

相关文章:

c# - 是否有更简洁的方法使用 LINQ 将项目添加到集合属性?

c# - lucene 2.9.2.2 一个很奇怪的问题,不能搜索关键字 "a",其他的可以

c# - 什么是处理异常的最佳方法以及如何在asp.net中处理它们

C# - 通过网络序列化数据包

c# - Wpf 数据触发值可以是通用类型吗?

c# - 将字符串转换为字节数组

c# - System.Drawing 图像在使用语句关闭后被锁定

c# - 如何通过超链接字段传递变量背后的代码

c# - 为什么是 ArgumentNullException?为什么不是 System.NullReferenceException?

c# - 无法更改以 "/"作为分隔符的日期格式,如果默认系统日期格式以 "-"作为日期分隔符