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

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

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

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

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

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

Type 'Foo' already defines a member called 'Test' with the same parameter types

但为什么呢?

让我们编译成功,然后:

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

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

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

Member 'Foo.Test()' cannot be accessed with an instance reference; qualify it with a type name instead

最佳答案

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

Test();

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

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

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

关于c# - 为什么 C# 编译器重载解析算法将具有相同签名的静态成员和实例成员视为相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6033455/

相关文章:

javascript - C# bool 函数正在从服务器返回一个对象到客户端

c# - 将字符串长度转换为十六进制值以添加到 List<byte>

c# - 两个 C# 扩展泛型方法之间的调用不明确,其中 T :class and other where T:struct

c# - 循环声明中的方法执行

c# - 检查浏览器是否接受 cookie

c# - 限制任务并行库中的线程数

c# - 关于检查空值的问题

c++ - 从同一类的专用模板的静态函数访问类模板成员

java - 为什么在线程之间共享静态变量会降低性能?

c++ - 在派生类中使用提取运算符(>>)的方法和在C++中处理静态数据成员的方法