Mi código de no compilación actual es similar a esto:
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) { }
}
El compilador de C # se niega a compilar esto, citando la siguiente regla / error:
'MyProject.MyFoo <TA>' no puede implementar tanto 'MyProject.IFoo <TA>' y 'MyProject.IFoo <MyProject.B>' porque pueden unificarse para algunas sustituciones de parámetros de tipo
Entiendo lo que significa este error; si TApudiera ser cualquier cosa, técnicamente también podría ser un Bque introduciría ambigüedad sobre las dos Handleimplementaciones diferentes .
Pero TA no puede ser nada. Según la jerarquía de tipos, TA no puede ser B, al menos, no creo que pueda. TAdebe derivar de A, que no deriva de B, y obviamente no hay herencia de clases múltiples en C # / .NET.
Si quito el parámetro genérico y sustituir TAcon C, o incluso A, que se compila.
Entonces, ¿por qué obtengo este error? ¿Es un error o falta de inteligencia general del compilador, o hay algo más que me falta?
¿Hay alguna solución alternativa o simplemente tendré que volver a implementar la MyFooclase genérica como una clase no genérica separada para cada TAtipo derivado posible ?