Контрвариация обобщенных интерфейсов
От: navab  
Дата: 01.07.13 09:49
Оценка:
Насколько я понимаю, если определен контрвариационный обобщенный интерфейс, то метод, чей параметр помечен как 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());
           
        }
    }
Почему в качестве параметра не удается передать экземпляр класса родителя?
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.