Почему компилятор C # жалуется, что «типы могут объединяться», когда они происходят от разных базовых классов?

Мой текущий некомпилируемый код похож на этот:

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 ?

74
задан Aaronaught 5 October 2011 в 17:01
поделиться