Warum ergibt das CS0695?

8
%Vor%

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%     
main-- 09.03.2013, 22:59
quelle

1 Antwort

7

Von Compiler Error CS0695

  

'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:

  • Implementieren Sie nur eines von diesen oder
  • Ändern Sie die Typparameter, um den Konflikt zu vermeiden.

Von C# 5.0 Language Specification

  

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:

%Vor%
  

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 aus    I<U> und I<V> . Die Deklaration ist ungültig, weil sie konstruiert wurde   type mit U und V 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 Derived<U,V> sowohl I<U> implementiert   und I<V> . Der Code

%Vor%      

ruft die Methode in Derived auf, seit Derived<int,int> effektiv   implementiert I<int> (§13.4.6) erneut.

[Hervorhebung durch den SO-Editor.]

    
Soner Gönül 09.03.2013, 23:10
quelle

Tags und Links