具有相同名称的静态和实例方法?

时间:2008-10-01 22:48:45

标签: c# .net oop

我在C#中有一个同时具有静态和非静态接口的类。是否可以在具有相同名称和签名的类中使用静态和非静态方法?

当我尝试执行此操作时出现编译器错误,但出于某种原因,我认为有一种方法可以执行此操作。我错了还是没有办法在同一个类中同时使用静态和非静态方法?

如果无法做到这一点,是否有一种很好的方法可以实现这样的一般性应用于任何情况?

修改
根据我收到的回复,很明显没有办法做到这一点。我将使用不同的命名系统来解决这个问题。

6 个答案:

答案 0 :(得分:57)

不,你不能。限制的原因是静态方法也可以从非静态上下文中调用,而不需要预先添加类名(因此MyStaticMethod()而不是MyClass.MyStaticMethod())。如果你有两个,编译器无法分辨你正在寻找哪个。

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

答案 1 :(得分:43)

实际上,有一种方法可以通过显式实现接口来实现这一目标。它不是一个完美的解决方案,但它可以在某些情况下起作用。

interface IFoo
{
    void Bar();
}

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

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

当我为P / Invoke调用创建包装类时,我有时遇到这种情况。

答案 2 :(得分:12)

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

class Foo
{
    static void Bar()
    {
    }

    void Fizz()
    {
        Bar();
    }
}

...因此,不允许您拥有静态方法和具有相同签名的实例方法。

你想要完成什么?如果不了解具体细节,很难提出解决方法。我只是重命名其中一种方法。

答案 3 :(得分:3)

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
   }
}

答案 4 :(得分:0)

您可以使用相同名称的static和instance方法,只要它们的声明在参数的数量或类型上有所不同。关于如何在类中使用两个具有相同名称的实例方法,这是相同的规则。

虽然从技术上讲,在静态与实例方法的情况下,它们已经因实例方法中隐式this参数的存在而不同,但这种差异还不足以让编译器确定要调用哪两个中的哪一个

更新:我犯了一个错误。返回值不足以具有不同的签名。

答案 5 :(得分:0)

行。 这个问题的根源是C#不应该让你从实例方法调用静态方法而不指定类型名称。

其他完整的OO语言(如Smalltalk)不允许这样做,也只是让理解对象的人感到困惑。 实例端和类(或静态)端之间的分离是非常重要的,并且有一种促进这些细节混淆的语言是........不是一个好主意....但我们期望的类型的东西的典型来自MS。

阿德里安