c# - 为什么静态和非静态方法不能共享相同的签名?

标签 c# polymorphism

C# 提供以下 signature characteristics在函数重载时使用。

我们知道重载只考虑参数;它们的数量和类型,但多态性的目标是根据调用策略提供相同的名称但不同的用法。

如果我有一个类包含两个具有相同名称和签名的方法,而一个是静态的而另一个不是,C# 编译器会抛出一个错误; “Class already defined a member called 'foo' with the same parameter types”. 对这两种方法的调用将有所不同;一个带有对象名称,一个带有类名称的静态。因此调用策略没有歧义。那为什么会报错呢?

 class Example {

    public void foo() { }
    public static void foo() { }

}

class Program
{
    static void Main(string[] args)
    {

        Example e = new Example();
        e.foo(); 

    }
}

最佳答案

它抛出错误的原因是可以从非静态方法调用静态方法而无需指定类型名称。在这种情况下,编译器将无法确定调用的是哪个方法。

public class Foo()
{
   public static void MyMethod() {};
   public void MyMethod() {}

   public void SomeOtherMethod()
   {
      MyMethod(); // which method we're calling static or non-static ?
   }
}

编辑

刚找到这个SO post关于你的情况。您可能还想检查一下。

关于c# - 为什么静态和非静态方法不能共享相同的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758717/

相关文章:

c# - AppFabric DataCache 按键获取值?

c# - 为什么 IDE 不提供像断点这样的内置代码计时功能?

java - super . super .func()? - Java多态性

java - Jackson JsonView 和 JsonTypeInfo

c# - 将多个控件的特殊属性设置为相同的值

C# 继承 : implements + extends

c# - 关于正则表达式的实现

c++ - 堆栈超出范围。也许没有正确调用它?

java - java变量的多态或改名

c++ - boost 序列化多态性问题