Контрвариация обобщенных интерфейсов
От: 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());
           
        }
    }
Почему в качестве параметра не удается передать экземпляр класса родителя?
Спасибо.
Re: Контрвариация обобщенных интерфейсов
От: hardcase Пират http://nemerle.org
Дата: 01.07.13 12:13
Оценка:
Здравствуйте, navab, Вы писали:

N>Почему в качестве параметра не удается передать экземпляр класса родителя?


Потому что он не является подтипом B.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Контрвариация обобщенных интерфейсов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 02.07.13 03:12
Оценка:
Здравствуйте, navab, Вы писали:

N>Насколько я понимаю, если определен контрвариационный обобщенный интерфейс, то метод, чей параметр помечен как in, должен принимать либо указанный тип, либо более обобщенный тип


Это неверное представление. Метод всегда принимает только такие аргументы, которые имеют неявное преобразование к типу соответствующего параметра. Пример неявного преобразования — приведение производного типа к базовому. Модификатор in при декларации типа-параметра на это никак не влияет. Он влияет на то, какие преобразования существуют между инстанциациями контравариантного интерфейса с различными типами-аргументами.

N> по аналогии с тем, как это сделано в обобщенных делегатах.


В чем, предположительно, состоит эта аналогия?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.