Frage zu mehrdeutigen Aufrufen in C #

8

Ich habe eine Frage, die nicht wirklich ein Problem ist, aber etwas, das mich ein bisschen neugierig gemacht hat.

Ich habe eine Klasse mit zwei Methoden drin. Eine ist eine statische Methode und die andere ist eine Instanzmethode. Die Methoden haben den gleichen Namen.

%Vor%

Wenn ich versuche, mein Projekt zu erstellen, erhalte ich die Fehlermeldung:

  

Der Ruf ist zwiespältig zwischen den   folgende Methoden oder Eigenschaften:   'MyApp.BlockHeader.Peek (System.IO.BinaryReader)'   und   'MyApp.BlockHeader.Peek (System.IO.BinaryReader)'

Ich weiß, dass die Methodensignaturen praktisch identisch sind, aber ich kann nicht sehen, wie ich möglicherweise eine statische Methode direkt von einem Instanzmitglied aufrufen könnte.

Ich nehme an, dass es einen sehr guten Grund dafür gibt, aber weiß jemand, was dieser Grund ist?

    
Patrik 20.05.2009, 09:30
quelle

3 Antworten

9

Die allgemeine Richtlinie des C # -Designs besteht darin, Sie zu zwingen, anzugeben, wo eine mögliche Mehrdeutigkeit besteht. Angesichts von Refactoring-Tools, die es erlauben, im Handumdrehen zu überprüfen, ob Dinge statisch sind oder nicht, ist diese Haltung großartig - besonders für solche Fälle. Sie werden viele andere Fälle wie diesen sehen (override vs virtual, new for shadowing etc.).

Im Allgemeinen macht das Entfernen dieses Typs von Raum für Verwirrung den Code klarer und zwingt Sie, Ihr Haus in Ordnung zu halten.

EDIT: Ein guter Beitrag von Eric Lippert diskutiert einen weiteren Grund für diese Mehrdeutigkeit zu dem Fehler, den du gesehen hast

    
Ruben Bartelink 20.05.2009, 09:36
quelle
4

Hier ist ein Auszug aus der C # 3.0-Sprachspezifikation.

  

Die Signatur einer Methode muss in der Klasse, in der die Methode deklariert ist, eindeutig sein. Die Signatur einer Methode besteht aus dem Namen der Methode, der Anzahl der Typparameter und der Anzahl, Modifikatoren und Typen ihrer Parameter. Die Signatur einer Methode enthält nicht den Rückgabetyp.

Der Modifikator "static" ist nicht Teil der Signatur, daher verletzt Ihr Beispiel diese Regel eindeutiger Signaturen.

Ich kenne den Grund für die Regel jedoch nicht.

    
Vizu 20.05.2009 10:08
quelle
2

Ich denke, es gibt keinen technischen Grund, es abzulehnen, aber es ist mehr getan, um den Programmierer vor sich selbst zu schützen. Betrachten Sie das folgende Beispiel:

%Vor%

Das obige Beispiel ist absolut gültig, aber wenn die von Ihnen beschriebene Situation erlaubt wäre, wäre es lesbar? Konnten Sie im Handumdrehen sehen, ob die Instanzmethode oder die statische Methode aufgerufen wurde?

    
Razzie 20.05.2009 09:47
quelle

Tags und Links