Как ссылка может показать мне объект большего размера?
Во-первых, это меньше типа. Каждый жираф - это животное, но не каждое животное - это жираф. Поэтому в мире меньше жирафов, чем животных в мире. Поэтому жираф - меньший тип, чем животное.
Ваш тип B является меньшим типом, чем А. И, конечно, ссылка на больший тип может относиться к чему-то меньшего типа.
Это не имеет ничего общего с ковариацией. Это всегда тот случай, когда IEnumerable<A>
может дать вам B
:
List<A> myList = new List<A>() { new B(); } // No covariance here
Console.WriteLine(myList[0].GetType()); // it's a B.
Список животных может содержать жирафа. Это не имеет ничего общего с ковариацией.
Точно так же ссылка всегда может вернуть вам меньший тип:
A a = new B(); // Legal!
тем, кто говорит, что это не имеет ничего общего с ковариацией ...
То, что последовательность A может содержать a B, не имеет ничего общего с ковариацией. Что касается ковариации, то последовательность B может быть преобразована в последовательность A путем преобразования ссылок. До того, как ковариантные преобразования были добавлены в C # 4, это преобразование не удалось бы.
Что если бы я хотел увидеть в функции свойство a1 из класса A? что я должен изменить?
Вы не должны ничего менять; это уже работает. Попробуй.