Ковариация и контравариантность для аргумента одного и того же типа

Спецификация C # утверждает, что тип аргумента не может быть одновременно ковариантным и контравариантным.

Это очевидно при создании ковариантного или контравариантного типа. Контравариантный интерфейс вы украшаете параметры своего типа с помощью «out» или «in» соответственно. Не существует варианта, который позволял бы и то, и другое одновременно («outin»).

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

Редактировать:

Я так понимаю, что массивы на самом деле ковариантны и контравариантны.

public class Pet{}
public class Cat : Pet{}
public class Siamese : Cat{}
Cat[] cats = new Cat[10];
Pet[] pets = new Pet[10];
Siamese[] siameseCats = new Siamese[10];

//Cat array is covariant
pets = cats; 
//Cat array is also contravariant since it accepts conversions from wider types
cats = siameseCats; 
10
задан William Edmondson 24 December 2010 в 21:25
поделиться