Мій поточний некомпілюючий код подібний до цього:
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 це не може бути B- принаймні, я не думаю, що може. TAповинен походити з A, що не походить з B, і, очевидно, у C # /. NET немає успадкування декількох класів.
Якщо я видалю загальний параметр і замінюю TAна C, або навіть A, він компілюється.
То чому я отримую цю помилку? Це помилка або загальна неінтелектуальна інформація компілятора, чи щось ще мені не вистачає?
Чи є якесь обхідне рішення, або мені просто доведеться повторно реалізувати MyFooзагальний клас як окремий не-загальний клас для кожного можливого TAпохідного типу?