Niech mamy dwóch członków równe podpisem, ale jedno jest statyczna, a drugi - nie jest:Dlaczego algorytm rozwiązywania przeciążenia kompilatora C# traktuje statyczne i członków wystąpienia z równą sygnaturą jako równą?
class Foo
{
public void Test() { Console.WriteLine("instance"); }
public static void Test() { Console.WriteLine("static"); }
}
ale taki kod wygenerować przynosi błąd kompilatora:
Type 'Foo' already defines a member called 'Test' with the same parameter types
Ale dlaczego?
Let my skompilowany, które z powodzeniem, a następnie:
Foo.Test()
powinna wyjścia "statyczne"new Foo().Test();
powinna wyjścia "instancja"
Nie można nazwać członkiem statyczne zamiast instancji pierwszej, ponieważ w tym przypadku wystąpi inny, bardziej uzasadniony błąd kompilatora:
Member 'Foo.Test()' cannot be accessed with an instance reference; qualify it with a type name instead
w tym przypadku kompilator powinien egzekwować używasz albo this.Test() lub Foo.Test(). Twoja argumentacja dotyczy również zmiennych instancji w porównaniu z parametrami, które mogą mieć również nazewnictwo. – codymanix
@codymanix: Wydaje mi się, że jestem jeszcze szczęśliwszy, bo to po prostu zabronione. Uważam, że jest to stosunkowo rzadkie, aby ta sama metoda miała sens (z tymi samymi parametrami), co zarówno instancja, jak i metoda statyczna ... –
+1 @codymanix Byłoby mądrzejszym (i uważam, że dokładniejszym) po prostu powiedzieć * niejednoznaczny wywołanie metody * niż po prostu zabraniaj, ponieważ metody statyczne i instancyjne * mogą * być odróżniane od siebie. –