静态和实例方法具有相同的名字吗?(Static and Instance methods with

2019-08-31 06:36发布

我有两个静态和C#中的非静态接口的类。 是否有可能有一个静态的,一类具有相同的名称和签名非静态方法?

我得到一个编译错误,当我尝试这样做,但出于某种原因,我认为有办法做到这一点。 我错了或者是有没有办法在同一类的静态和非静态方法?

如果这是不可能的,有没有实现这样的事情,可一般适用于任何情况的好办法?

编辑
从我所收到的答复,很明显,有没有办法做到这一点。 我有不同的命名系统,要解决此问题。

Answer 1:

不,你不能。 究其原因,限制是静态方法,也可以从非静态上下文叫,而无需预先设置的类名(所以MyStaticMethod()而不是MyClass.MyStaticMethod())。 编译器不能告诉你要找的,如果你有两个。

您可以使用相同的名称静态和非静态方法,但遵循相同的规则,方法重载不同的参数,他们只是不能有完全相同的签名。



Answer 2:

其实,还有一种是通过明确实现一个接口来做到这一点的方式。 它不是一个完美的解决方案,但它可以在某些情况下工作。

interface IFoo
{
    void Bar();
}

class Foo : IFoo
{
    static void Bar()
    {
    }

    void IFoo.Bar()
    {
        Bar();
    }
}

我有时会碰到这种情况时,我做的包装类的P / Invoke调用。



Answer 3:

您还可以从实例方法静态方法,而无需指定类型名称:

class Foo
{
    static void Bar()
    {
    }

    void Fizz()
    {
        Bar();
    }
}

...所以它是有道理的,你就不会被允许有一个静态方法具有相同签名的实例方法。

你想达到什么目的? 很难提出一个解决办法不知道细节。 我只是重新命名的方法之一。



Answer 4:

C#,当谈到这不是精心设计的...

虽然这是事实,你能想到的全局或非全局,就应该选择一个默认情况下,如果你想在其他然后你只是限定它更多。

class Logger {
   public static Logger instance;

   public static void Log(string message) {
       instance.Log(message); // currently the compiler thinks this is ambiguous, but really its not at all.  Clearly we want the non-static method
   }

   public void Log(string message) {

   }

   public void DoStuff() {
      Log("doing instance stuff"); // this could be ambiguous, but in my opinion it should default to a call to this.Log()
      Logger.Log("doing global stuff"); // if you want the global qualify it explicitly
   }
}


Answer 5:

你可以有静态和实例方法具有相同的名称,只要其声明中的参数个数或类型不同。 这是你如何能有一个类中的两个同名的实例方法相同的规则。

虽然在技术上,在静态与实例方法的情况下,他们已经由隐这个参数的实例方法存在差异,这种差异是不够的编译器,以确定要调用的两个。

更新 :我犯了一个错误。 返回值是不够的,有不同的签名。



Answer 6:

好。 这个问题的根源是,C#不应该让你打电话从一个实例方法静态方法不指定类型名称。

其他全OO语言(如Smalltalk)不允许这也是它只是混淆谁了解对象的人。 例如侧面和类(或静态)侧之间的分离是非常重要的,具有促进这些细节混淆语言........不是一个好主意....但典型的类型的东西,我们希望从MS。

阿德里安



文章来源: Static and Instance methods with the same name?
标签: c# .net oop