Ich habe diese interessante Frage T
-Deklaration auf Klassenebene und den gleichen Buchstaben T
(unterschiedliche Bedeutung) auf Methodenebene spricht.
Also habe ich einen Test gemacht.
%Vor%Als sagte Eric warnt der Compiler.
Aber Hey, was ist mit der Sicherheit passiert? Ich nehme an, dass es auf der Methodenebene eine Typsicherheit gibt, aber was ist mit dem globalen Kontext der Klasse, in der T
bereits deklariert wurde.
Ich meine, wenn jemand mich gefragt hätte, würde ich vermuten, dass es dort einen Fehler geben sollte und keine Warnung .
Warum der Compiler das erlaubt? ( Ich würde gerne eine vernünftige Antwort hören )
Interessante Frage. Typ Sicherheit ist hier erhalten. Verhalten ist vergleichbar mit globalen und lokalen Variablen. In MyMethod geben Sie T eindeutig ein. Wir können auch eine neue Instanz von MyClass wie folgt erstellen und zurückgeben:
%Vor%Das Programm:
%Vor%Es gibt keinen Kompilierungsfehler und dies sollte nicht sein, da die Typensicherheit erhalten bleibt. Programm kann kompiliert werden. Es gibt keine Zweideutigkeit.
Die Warnung sollte da sein, weil T das Gegenstück auf Klassenebene überschreibt und es gibt keinen einfachen Weg in MyMethod , dieses globale T zu erhalten . Es verschleiert auch die Lesbarkeit.
MSDN sagt über Flexibilität und gute Praxis in Generischen Methoden (C # -Programmierung Führer) :
Wenn Sie eine generische Methode definieren, die dieselben Typparameter wie die umschließende Klasse verwendet, generiert der Compiler die Warnung CS0693, weil das Argument für das innere T innerhalb des Methodenbereichs das für das äußere T angegebene Argument verbirgt Die Flexibilität beim Aufrufen einer generischen Klassenmethode mit anderen Typargumenten als denen, die bei der Instanziierung der Klasse angegeben wurden, könnte eine andere Kennung für den Typparameter der Methode liefern.
Dies ist kein Typsicherheits-Problem. Es ist nur ein Lesbarkeitsproblem - deshalb ist es nur eine Warnung. (T verbirgt auch das äußere T.)
Wenn Sie MyMethod () zu:
ändern %Vor%Es wird System.String für Ihren Beispielcode ausgeben, um zu beweisen, dass es den richtigen Typ erhält.
Tags und Links .net c# generics type-safety