Основы языка C# 2005. Евсеева О.Н - 35 стр.

UptoLike

Составители: 

39
2.2.2. Семантика присваивания
Рассмотрим присваивание: x = e.
Чтобы присваивание было допустимым, типы переменной x и выражения
e должны быть согласованными. Пусть сущность x согласно объявлению
принадлежит классу T. Будем говорить, что тип T основан на классе T и
является базовым типом x, так что базовый тип определяется классом
объявления. Пусть теперь в рассматриваемом нами присваивании выражение e
связано с объектом типа T1. Тип T1 согласован по присваиванию с базовым
типом T переменной x, если класс T1 является потомком класса T. Присваивание
допустимо, если и только если имеет место согласование типов.
Например, пусть задан некоторый класс Parent, а класс Childего
потомок, объявленный следующим образом:
class Child : Parent {...}
Пусть теперь в некотором классе объявлены переменные этих классов и
созданы связанные с ними объекты:
Parent p1 = new Parent(), p2 = new Parent();
Child ch1 = new Child(), ch2 = new Child();
Тогда допустимы присваивания:
p1 = p2; p2 = p1; ch1 = ch2; ch2 = ch1; p1 = ch1; p1 = ch2;
Но недопустимы присваивания:
ch1 = p1; ch2 = p1; ch2 = p2;
Отметим, что потомок может вернуть себе переданный родителю объект,
задав явное преобразование. Так что следующие присваивания допустимы:
p1 = ch1; ... ch1 = (Child)p1;
Семантика присваивания справедлива и для другого важного случая
при рассмотрении соответствия между формальными и фактическими
аргументами процедур и функций. Если формальный аргумент согласно
объявлению имеет тип T, а выражение, задающее фактический аргумент, имеет
тип T1, то имеет место согласование типов формального и фактического
аргумента, если и только если класс T1 является потомком класса T. Отсюда
незамедлительно следует, что если формальный параметр процедуры
принадлежит классу Object, то фактический аргумент может быть выражением
любого типа.
2.2.3. Преобразование к типу object
Рассмотрим частный случай присваивания x = e; когда x имеет тип object.
В этом случае гарантируется полная согласованность по присваиванию
выражение e может иметь любой тип. В результате присваивания значением
переменной x становится ссылка на объект, заданный выражением e. Отметим,
текущим типом x становится тип объекта, заданного выражением e. Уже здесь
проявляется одно из важных различий между классом и типом. Переменная,