我当前的非编译代码与此类似:
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) { }
}
C#编译器由于以下规则/错误而拒绝对此进行编译:
'MyProject.MyFoo <TA>'无法同时实现'MyProject.IFoo <TA>'和'MyProject.IFoo <MyProject.B>',因为它们可能会为某些类型参数替换统一
我了解此错误的含义;如果TA
可以是任何东西,那么从技术上讲它也可能是一个B
会引入两种不同Handle
实现方式的歧义的东西。
但是TA不能是任何东西。基于类型层次结构,TA
不能是B
-至少,我认为它不能。 TA
必须从派生A
,而不能从派生B
,并且显然C#/。NET中没有多类继承。
如果删除通用参数并替换TA
为C
或什至A
,它将编译。
那么,为什么会出现此错误?是编译器中的错误或普遍的非智能性,还是我遗漏了其他东西?
是否有任何解决方法,或者我将不得不MyFoo
针对每个可能的TA
派生类型将泛型类重新实现为单独的非泛型类?