Подпадает ли преобразование нормального базового типа в производный тип объекта в раздел "Ковариация" и "контравариантность"?

Ковариация и контравариантность обеспечивают неявное преобразование ссылок для типов параметров Arrays, Delegates и Generic.

IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;

Action<object> actObject = SetObject;
Action<string> actString = actObject;

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

ChildClass childobj=new ChildClass;
BaseClass baseobj=childobj;

BaseClass baseobj=new BaseClass;
ChildClass childobj= (BaseClass) baseobj;

Если да, то как среда выполнения обрабатывает это, а если нет, то почему?


person Anoob Aliyar    schedule 01.08.2014    source источник
comment
Примеры 3 и 4 - это не ковариация и контравариантность. Это просто преобразование ссылок. Пример 4 не компилируется.   -  person Sriram Sakthivel    schedule 01.08.2014


Ответы (1)


Ковариация и контравариантность применимы только к параметрическому полиморфизму, например. когда один тип имеет другой тип в качестве параметра. Это потому, что некоторые варианты использования могут компилироваться, даже если они не набраны правильно. Например, вот так.

Ваш второй пример - это простой полиморфизм данных, для которого нет необходимости применять ковариацию и контравариантность, потому что эти варианты использования неприменимы.

person Euphoric    schedule 01.08.2014
comment
Спасибо за быстрый ответ. В C # массивы, в которых тип элемента является ссылочным, являются ковариантными. Например: Животное [] животное = новое Млекопитающее [10]; Для массивов это не относится к параметрическому полиморфизму, который также содержит данные. Тогда как это относится к ковариации и контравариантности? - person Anoob Aliyar; 01.08.2014
comment
@AnoobAliyar Вы должны рассматривать это также как параметрический полиморфизм. Допустим Animal[] как Array<Animal>, тогда все ясно. - person Sriram Sakthivel; 01.08.2014
comment
@AnoobAliyar Именно так говорит Шрирам. Тот факт, что существует другой синтаксис, не означает, что типы разные. - person Euphoric; 01.08.2014
comment
Вы хотите сказать, что массив будет внутренне представлен как Array ‹Animal›? Пожалуйста, предложите несколько полезных ссылок для полиморфизма данных, если они у вас есть. - person Anoob Aliyar; 01.08.2014