为什么C#编译器重载解析算法将具有相同签名的静态和实例成员视为相等?

时间:2011-05-17 15:43:37

标签: c# .net static-members overload-resolution

让我们有两个成员相同的签名,但一个是静态的而另一个是 - 不是:

class Foo
{
    public void Test() { Console.WriteLine("instance"); }

    public static void Test() { Console.WriteLine("static"); }
}

但是这样的代码生成会带来编译错误:

  

类型'Foo'已经定义了一个名为'Test'的成员,其参数类型相同

但为什么?

让我们成功编译,然后:

  • Foo.Test()应输出“static”

  • new Foo().Test();应输出“instance”

无法调用静态成员而不是实例1,因为在这种情况下会出现另一个更合理的编译器错误:

  

使用实例引用无法访问成员'Foo.Test()';使用类型名称来限定它

1 个答案:

答案 0 :(得分:13)

从实例方法怎么样:

Test();

那叫什么?您可能希望为静态方法赋予实例方法“优先级”,但两者都适用。

我会说,即使它被允许,从可读性的角度来看这是一个根本不好的想法......例如,如果你改变了一个名为Test的方法是静态的例如,它会以微妙的方式改变含义。

换句话说,我对此被禁止没有任何问题:)