2011-05-17 12 views
14

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

Odpowiedz

12

Co z metody instancji:

Test(); 

Co by to nazwać? Prawdopodobnie chcesz nadać instancji metodę "priority" nad metodą statyczną, ale obie będą miały zastosowanie.

Powiedziałbym, że nawet gdyby było to dozwolone, byłoby z gruntu złym pomysłem zrobienie tego z punktu widzenia czytelności ... na przykład, gdyby zmienić metodę, która wywołała Test z statycznego na instancję, zmieniłoby to znaczenie w subtelny sposób.

Innymi słowy, nie mam problemu z tym jest zabronione :)

+3

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

+0

@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

+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. –

Powiązane problemy