Мой текущий некомпилирующий код похож на этот:
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) { }
}
Компилятор С# отказывается компилировать его, ссылаясь на следующее правило/ошибку:
'MyProject.MyFoo < ТА > ' не может реализовать оба параметра "MyProject.IFoo <TA> "; и 'MyProject.IFoo < MyProject.B > ' потому что они могут объединяться для некоторых подстановок параметров типа
Я понимаю, что означает эта ошибка; если TA
может быть вообще чем-то вообще, то он может технически быть также B
, который вводит двусмысленность в отношении двух различных реализаций Handle
.
Но TA не может быть чем угодно. На основе иерархии типов TA
не может быть B
- по крайней мере, я не думаю, что это возможно. TA
должен выводиться из A
, который не выводится из B
и, очевидно, нет наследования множественного класса в С#/. NET.
Если я удалю общий параметр и заменим TA
на C
или даже A
, он скомпилируется.
Так почему я получаю эту ошибку? Это ошибка или вообще неинтеллектуальность компилятора, или есть что-то еще, что мне не хватает?
Есть ли какое-либо обходное решение или мне просто придется повторно реализовать общий класс MyFoo
как отдельный не-общий класс для каждого возможного производного типа TA
?