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