14

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

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

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

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

类型“Foo”已经定义了一个名为“Test”的成员,具有相同的参数类型

但为什么?

让我们编译成功,然后:

  • Foo.Test()应该输出“静态”

  • new Foo().Test();应该输出“实例”

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

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

4

1 回答 1

13

怎么样,从一个实例方法:

Test();

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

我会说,即使它被允许,从可读性的角度来看这样做也是一个根本的坏主意......例如,如果你将一个调用的方法Test从静态更改为实例,它会改变含义以一种微妙的方式。

换句话说,我对这个被禁止没有意见:)

于 2011-05-17T15:48:04.320 回答