Mein aktueller nicht kompilierter Code ähnelt dem folgenden:
public abstract class A { }
public class B { }
public class C : A { }
public interface IFoo<T>
{
void Handle(T item);
}
public class MyFoo<TA> : IFoo<TA>, IFoo<B>
where TA : A
{
public void Handle(TA a) { }
public void Handle(B b) { }
}
Der C # -Compiler weigert sich, dies zu kompilieren, und führt die folgende Regel / den folgenden Fehler an:
'MyProject.MyFoo <TA>' kann nicht sowohl 'MyProject.IFoo <TA>' als auch 'MyProject.IFoo <MyProject.B>' implementieren, da sie möglicherweise für einige Typparameter-Ersetzungen vereinheitlicht werden
Ich verstehe, was dieser Fehler bedeutet; Wenn TA
es überhaupt etwas geben könnte, könnte es auch technisch gesehen ein B
Problem sein, das zu Unklarheiten über die beiden verschiedenen Handle
Implementierungen führen würde.
Aber TA kann nichts sein. Basierend auf der Typhierarchie TA
kann es nicht sein B
- zumindest glaube ich nicht, dass es das kann. TA
muss ableiten von A
, was nicht abgeleitet ist B
, und offensichtlich gibt es in C # /. NET keine Vererbung mehrerer Klassen.
Wenn ich die generischen Parameter entfernen und zu ersetzen TA
mit C
, oder sogar A
, kompiliert.
Warum erhalte ich diesen Fehler? Ist es ein Fehler oder eine allgemeine Unintelligenz des Compilers oder fehlt mir noch etwas?
Gibt es eine Problemumgehung oder muss ich die MyFoo
generische Klasse nur als separate nicht generische Klasse für jeden möglichen TA
abgeleiteten Typ erneut implementieren ?