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 TAes überhaupt etwas geben könnte, könnte es auch technisch gesehen ein BProblem sein, das zu Unklarheiten über die beiden verschiedenen HandleImplementierungen 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. TAmuss 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 TAmit 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 MyFoogenerische Klasse nur als separate nicht generische Klasse für jeden möglichen TAabgeleiteten Typ erneut implementieren ?