C#提供以下签名特征,以在函数重载时使用。
我们知道,对于重载,仅考虑参数。它们的数量和类型,但是多态性的目的是根据调用策略提供相同的名称但使用不同的用法。
如果我有一个包含两个具有相同名称和签名的方法的类,而一个方法是静态的而另一个方法则不是,则C#编译器将引发错误。``类已经用相同的参数类型定义了一个名为'foo'的成员''。这两种方法的调用将有所不同; 一个带有对象名称,而一个带有类名称。因此,调用策略没有歧义。那为什么会抛出错误呢?
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帖子。您可能还需要检查它。
但是您可以声明一个与现有字段同名的局部变量。您可以使用专门引用该字段
this
。这将是相同的-this.MyMethod-实例;MyMethod或Foo.MyMethod-静态。@ViktorArsanov并不是您在这里可以做什么或不能做什么,而是关于编译器如何影响这段代码。编写此c#代码是合法的,但是编译器无法理解应该调用哪种方法。
这个答案是不正确的。想象一下,如果编译器指示语言设计团队使用什么是合法的,而不是相反的。由于可以找到一种解决方案(如Viktor所建议的那样),并且正如Viktor所提到的已在另一位置接受该语言一样,现在唯一剩下的问题是语言设计团队为何不允许静态/非静态成员具有相同的签名/名称?请参阅我的答案以获取正确的信息。