Тема: Проблема з наслідуванням одноіменних інтерфейсів (generic)
Досить давно програмую на C#, але тільки недавно помітив таку цікаву штуку:
C# v3.0 (принаймні в VisualStudio) не підтримує множинне наслідування однакових generic-інтерфейсів з різними типами-параметрами (на Java така сама біда твориться).
Наприклад наступний код не компілюється:
public interface MyInterface<T>
{
    T GetData();
    void SetData(T data);
}
public class MyClass<T1, T2> : MyInterface<T1>, MyInterface<T2>
{
    private T1 _t1;
    private T2 _t2;
    public T1 GetData() { return _t1; }
    public void SetData(T1 data) { _t1 = data; }
    T2 MyInterface<T2>.GetData() { return _t2; }
    public void SetData(T2 data) { _t2 = data; }
}Пише, що не можна наслідувати обидва інтерфейси, бо T1 може бути таким як T2.
Ну це ще можна би було зрозуміти, але я спробував наступний код:
public class C1 { }
public class C2 { }
public interface MyInterface<T>
{
    T GetData();
    void SetData(T data);
}
public class MyClass<T1, T2> : MyInterface<T1>, MyInterface<T2>
    where T1 : C1
    where T2 : C2
{
    private T1 _t1;
    private T2 _t2;
    public T1 GetData() { return _t1; }
    public void SetData(T1 data) { _t1 = data; }
    T2 MyInterface<T2>.GetData() { return _t2; }
    public void SetData(T2 data) { _t2 = data; }
}і він теж не компілюється (виводить таке ж повідомлення як і перед тим).
Але я вирішив не здаватися і попробував до першого варіанту дописати допоміжний клас:
public interface MyInterface<T>
{
    T GetData();
    void SetData(T data);
}
public class Helper<T> : MyInterface<T>
{
    private T _t1;
    public T GetData() { return _t1; }
    public void SetData(T data) { _t1 = data; }
}
public class MyClass<T1, T2> : Helper<T1>, MyInterface<T2>
{
    private T2 _t2;
    T2 MyInterface<T2>.GetData() { return _t2; }
    public void SetData(T2 data) { _t2 = data; }
}І тут сталося диво ...
З допоміжним класом все запрацювало.
Скажіть мені хто-небудь, чому таке наслідування (як на початку) не дозволяється ?
Чому останній варіант - норм, а перший ні ?
Адже по суті MyClass і в першому і в останньому випадках однаковий.
Чим керувалися розробники мов програмування ?
Можливо ви теж зіштовхувалися з такою проблемою, напишіть як ви її вирішували.


