Насколько я понимаю, если определен контрвариационный обобщенный интерфейс, то метод, чей параметр помечен как in, должен принимать либо указанный тип, либо более обобщенный тип, по аналогии с тем, как это сделано в обобщенных делегатах.
public interface I <in T>
{
void IMethod(T GenericObject);
}
public interface Iout<out T>
{
}
class A : I<A>,Iout<A>
{
public void IMethod(A a)
{
}
}
class B : A ,I<B>,Iout<B>
{
public void IMethod(B b)
{
Console.WriteLine("So, that's contrvariation! ");
}
}
class Program
{
static void Main()
{
I<A> a = new A();
I<B> b = new B();
a.IMethod(new B());
b.IMethod(new A()); // преобразование невозможно
A a1 = new A();
B b1 = new B();
a1.IMethod(new A());
b1.IMethod(new A());
Iout<A> a2 = new A();
Iout<B> b2 = new B();
b = a;
a2 = b2;
b.IMethod(new B());
}
}
Почему в качестве параметра не удается передать экземпляр класса родителя?
Спасибо.