Почему эта иерархия наследования не позволяет это назначение? - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть следующая сложная иерархия наследования:

I1<I3>
A1 : C1, I2
C2 : A1, I3
C3 : A2<C2>, I4                
A2<C2> : I5, I1<C2>

В форме изображения:

Inheritance diagram

Запись:

I1<I3> i = new C3();

... приводит к ошибке компиляции "Невозможно преобразовать исходный тип ... в целевой тип ...".

Почему?

1 Ответ

0 голосов
/ 14 февраля 2012

Ковариантные и контравариантные общие параметры должны быть явно помечены как таковые.

Следующий код компилируется без ошибок (обратите внимание на ключевое слово out ):

class tmp
{
    class C1 {}
    interface I2 {}
    interface I3 {}
    interface I4 {}
    interface I5 {}
    interface I1<out I3> {}
    class A1 : C1, I2 {}
    class C2 : A1, I3 {}
    class C3 : A2<C2>, I4 {}
    class A2<C2> : I5, I1<C2> { }

    private void Main()
    {
        I1<I3> i = new C3();
    }
}

Конечно, без ключевого слова out оно завершается с тем же сообщением об ошибке, как вы описали.

...