我有两个静态和C#中的非静态接口的类。 是否有可能有一个静态的,一类具有相同的名称和签名非静态方法?
我得到一个编译错误,当我尝试这样做,但出于某种原因,我认为有办法做到这一点。 我错了或者是有没有办法在同一类的静态和非静态方法?
如果这是不可能的,有没有实现这样的事情,可一般适用于任何情况的好办法?
编辑
从我所收到的答复,很明显,有没有办法做到这一点。 我有不同的命名系统,要解决此问题。
我有两个静态和C#中的非静态接口的类。 是否有可能有一个静态的,一类具有相同的名称和签名非静态方法?
我得到一个编译错误,当我尝试这样做,但出于某种原因,我认为有办法做到这一点。 我错了或者是有没有办法在同一类的静态和非静态方法?
如果这是不可能的,有没有实现这样的事情,可一般适用于任何情况的好办法?
编辑
从我所收到的答复,很明显,有没有办法做到这一点。 我有不同的命名系统,要解决此问题。
不,你不能。 究其原因,限制是静态方法,也可以从非静态上下文叫,而无需预先设置的类名(所以MyStaticMethod()而不是MyClass.MyStaticMethod())。 编译器不能告诉你要找的,如果你有两个。
您可以使用相同的名称静态和非静态方法,但遵循相同的规则,方法重载不同的参数,他们只是不能有完全相同的签名。
其实,还有一种是通过明确实现一个接口来做到这一点的方式。 它不是一个完美的解决方案,但它可以在某些情况下工作。
interface IFoo
{
void Bar();
}
class Foo : IFoo
{
static void Bar()
{
}
void IFoo.Bar()
{
Bar();
}
}
我有时会碰到这种情况时,我做的包装类的P / Invoke调用。
您还可以从实例方法静态方法,而无需指定类型名称:
class Foo
{
static void Bar()
{
}
void Fizz()
{
Bar();
}
}
...所以它是有道理的,你就不会被允许有一个静态方法具有相同签名的实例方法。
你想达到什么目的? 很难提出一个解决办法不知道细节。 我只是重新命名的方法之一。
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
}
}
你可以有静态和实例方法具有相同的名称,只要其声明中的参数个数或类型不同。 这是你如何能有一个类中的两个同名的实例方法相同的规则。
虽然在技术上,在静态与实例方法的情况下,他们已经由隐这个参数的实例方法存在差异,这种差异是不够的编译器,以确定要调用的两个。
更新 :我犯了一个错误。 返回值是不够的,有不同的签名。
好。 这个问题的根源是,C#不应该让你打电话从一个实例方法静态方法不指定类型名称。
其他全OO语言(如Smalltalk)不允许这也是它只是混淆谁了解对象的人。 例如侧面和类(或静态)侧之间的分离是非常重要的,具有促进这些细节混淆语言........不是一个好主意....但典型的类型的东西,我们希望从MS。
阿德里安