object
implementiert nicht Stage
, daher kann weder TIn
noch TOut
jemals object
sein, richtig? Warum denkt der Compiler dann, dass PipelineElement<object, object>
und PipelineElement<TIn, TOut>
identisch werden können?
EDIT: Ja, es ist durchaus möglich dieselbe generische Schnittstelle mehrfach zu implementieren:
%Vor%'generischer Typ' kann nicht sowohl 'generische Schnittstelle' als auch 'generische Schnittstelle implementieren Schnittstelle ', weil sie für einen Typparameter vereinheitlichen können Substitutionen.
Dieser Fehler tritt auf, wenn eine generische Klasse mehrere Klassen implementiert Parametrisierung der gleichen generischen Schnittstelle, und es existiert a Geben Sie die Parametersubstitution ein, die die beiden Schnittstellen bilden würde identisch. Um diesen Fehler zu vermeiden, implementieren Sie nur eine der Schnittstellen, oder ändern Sie die Typparameter, um den Konflikt zu vermeiden.
Sie können nicht beide Interfaces PipelineElementBase<TIn, TOut>
und PipelineElement<object, object>
zu Ihrer abstrakten Klasse implementieren.
Wie die Fehlerseite sagt, sollten Sie:
Von C# 5.0 Language Specification
%Vor%13.4.2 Eindeutigkeit der implementierten Schnittstellen
Die durch eine generische Typdeklaration implementierten Schnittstellen müssen bestehen bleiben einzigartig für alle möglichen konstruierten Typen. Ohne diese Regel würde es unmöglich sein, die richtige Methode zu bestimmen, um sicher zu rufen konstruierte Typen. Nehmen wir zum Beispiel eine generische Klassendeklaration an durften wie folgt geschrieben werden:
%Vor%Wäre dies erlaubt, wäre es unmöglich, den Code zu bestimmen im folgenden Fall ausführen:
Um zu bestimmen, ob die Interface-Liste einer generischen Typdeklaration ist gültig, werden die folgenden Schritte ausgeführt:
Sei L die Liste der Interfaces, die direkt in einer generischen Deklaration für Klasse, Struktur oder Schnittstelle angegeben sind.
Fügt zu L alle Basisschnittstellen der in L bereits vorhandenen Schnittstellen hinzu.
Entfernen Sie alle Duplikate von L.
Wenn ein möglicher konstruierter Typ, der aus C erstellt wurde, nach Typargumenten in L ersetzt würde, würden zwei Interfaces in L entstehen identisch, dann ist die Deklaration von C ungültig. Einschränkung Deklarationen werden bei der Bestimmung aller möglichen nicht berücksichtigt konstruierte Typen.
In der Klassendeklaration
X
oben besteht die Schnittstellenliste L ausI<U>
undI<V>
. Die Deklaration ist ungültig, weil sie konstruiert wurde type mitU
undV
mit dem gleichen Typ würde diese beiden verursachen Schnittstellen zu identischen Typen.Es ist möglich, dass Schnittstellen bei verschiedenen Vererbungen angegeben werden Ebenen zu vereinheitlichen:
%Vor%Dieser Code ist gültig, obwohl
%Vor%Derived<U,V>
sowohlI<U>
implementiert undI<V>
. Der Coderuft die Methode in
Derived
auf, seitDerived<int,int>
effektiv implementiertI<int>
(§13.4.6) erneut.
[Hervorhebung durch den SO-Editor.]
Tags und Links c# generics compiler-errors