Объясните пожалуйста поведения контравариантных интерфейсов
Я изучаю ковариантность и контравариа́нтность интерфейсов на сайте "Метанит" там есть простой пример на эту тему начав экспериментировать с интерфейсами столкнулся с ошибкой которую я не понимаю , ниже приложу скриншоты с ошибкой, ну и попробую корректно задать вопрос:
При не контравариантном объекте я могу передать в параметр метода объекта наследника, хотя ссылку на объект хранит переменная типа родителя (получается что то вроде апкаста),
Почему при создании контравариантного объекта и вызове из него метода, я не могу передать в параметры этого метода объект родителя, тип параметра этого метод является наследник и якобы не может сделать явного преобразования???
хотя при не контравариантном варианте явное преобразование не требуется
{
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".
