Ковариантные и контравариантные общие параметры должны быть явно помечены как таковые.
Следующий код компилируется без ошибок (обратите внимание на ключевое слово 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 оно завершается с тем же сообщением об ошибке, как вы описали.