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 TA
pudiera ser cualquier cosa, técnicamente también podría ser un B
que introduciría ambigüedad sobre las dos Handle
implementaciones 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. TA
debe 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 TA
con 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 MyFoo
clase genérica como una clase no genérica separada para cada TA
tipo derivado posible ?