Объясните пожалуйста поведения контравариантных интерфейсов

Я изучаю ковариантность и контравариа́нтность интерфейсов на сайте "Метанит" там есть простой пример на эту тему начав экспериментировать с интерфейсами столкнулся с ошибкой которую я не понимаю , ниже приложу скриншоты с ошибкой, ну и попробую корректно задать вопрос:

При не контравариантном объекте я могу передать в параметр метода объекта наследника, хотя ссылку на объект хранит переменная типа родителя (получается что то вроде апкаста),

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

хотя при не контравариантном варианте явное преобразование не требуется

{
   
    interface C <in T>
    {
       
        void WithdrawOrAddMoney(int x , T acc );
        
        
    }
    class A
    {
       
        public virtual void Add(int sum)
        {    
                Console.WriteLine($"Добавлено на Рarent {sum} и на счёте {sum}");
        }
    }
    
    class B : A
    {
       
        public override void Add(int sum)
        { 
                Console.WriteLine($"Добавлено на Heir {sum} и на счёте {sum}");  
        }
    }

    class Test<T> : C<T> where T : A
    {
        
        public void WithdrawOrAddMoney(int x, T acc ) 
        {
           
           acc.Add(x);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            
            C<B> Accountst1 = new Test<A>();
            Accountst1.WithdrawOrAddMoney(400, new A() );

            C<A> Account2 = new Test<A>();
            Account2.WithdrawOrAddMoney(40, new A());

            C<A> Account3 = new Test<A>();
            Account3.WithdrawOrAddMoney(40, new B()); 
        }
    }
}
 Ошибка CS1503 Аргумент 2: не удается преобразовать из "ConsoleApp1.A" в "ConsoleApp1.B".

image


Ответы (0 шт):