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

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

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

如果这是不可能的,是否有一个很好的方法来实现这样的东西,一般可以适用于任何情况?

编辑
从我收到的回复中,显然没有办法做到这一点。 我要用一个不同的命名系统来解决这个问题。

6 Solutions collect form web for “具有相同名称的静态和实例方法?”

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

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

实际上,有一种方法可以通过明确地实现一个接口来实现这一点。 这不是一个完美的解决scheme,但它可以在某些情况下工作。

interface IFoo { void Bar(); } class Foo : IFoo { static void Bar() { } void IFoo.Bar() { Bar(); } } 

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

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

 class Foo { static void Bar() { } void Fizz() { Bar(); } } 

…所以这是有道理的,你将不被允许有相同的签名静态方法和实例方法。

你想达到什么目的? 不知道具体情况很难提出解决方法。 我只是重命名其中的一个方法。

C#没有很好的devise,当涉及到这…

诚然,你可能想要全球或非全球,它应该select一个默认情况下,如果你想另一个,那么你只是更多的资格。

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

只要声明的参数个数或types不同,就可以使用同名的静态和实例方法。 关于如何在一个类中拥有两个具有相同名称的实例方法,这是相同的规则。

尽pipe在技术上,在静态方法和实例方法的情况下,它们已经因实例方法中隐含的这个参数的不同而存在差异,但这种差异不足以让编译器确定要调用哪一个。

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

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

其他完整的面向对象的语言(如Smalltalk)不允许这样做,而且对于理解对象的人来说,它也只是混乱。 实例端和类(或静态)端之间的分离是非常重要的,并有一个语言,在这些细节,促使混乱是……..不是一个好主意….但我们期望types的东西的典型来自MS。

阿德里安

  • DDD是浪费时间吗?
  • 沮丧和倒戈
  • 编写健壮的“现代”Fortran代码
  • 我们为什么要使用Interface? 仅仅是为了标准化吗?
  • 我怎样才能以编程方式获得Django模型字段的max_length?
  • 在一个类中使用全局变量
  • 所有静态方法的类有什么问题吗?
  • Java中隐藏的方法是什么? 即使是JavaDoc的解释也是令人困惑的
  • 静态字段究竟如何在内部工作?
  • Python中的私人成员
  • 有更多的接口比正确的方法