Проблема ковариации C # 3.5?

Я много слышал / читал о проблемах ковариации в C #, и я хотел задать несколько вопросов и сценариев, так что, надеюсь, я смогу прояснить свое недоумение по этому поводу.

в этих примерах, пожалуйста, предположите, что следующее всегда определяется:

public class Apple : Fruit {}

Мой первый пример:

IList<Apple> apples = GetApples();
IList<Fruit> fruits = apples;

Это должно работать, верно? Я тестировал это пару раз на C #, и он компилировался и работал нормально (мои тесты для моего первого примера были немного больше этого, так как у меня были полиморфные вызовы, которые выводили данные на консоль).

Второй пример:

IList<Apple> apples = GetApples();
IList<object> fruits = apples;

] В этом втором примере я понимаю, что это не должно компилироваться и является корнем проблем ковариации, решаемых в .NET 4.0. Пожалуйста, поправьте меня, если я ошибаюсь. Я также знаю, что .NET 4.0 не допускает ковариации / контравариантности между конкретными типами, а только интерфейсами.

Наконец, я хотел бы получить несколько определений. Мне не совсем понятно значение этих трех терминов:

  • Ковариация
  • Контравариантность
  • Инвариантность (то же самое, что и инвариант?)

Что касается последнего слова, я часто использовал его в C ++ для обозначения к изменениям, которые имеют подразумеваемые правила. Например, если у меня есть целое число, и ему разрешено иметь значение только от 1 до 10, «инвариантность» заключается в том, что оно может быть только между 1 и 10. Я могу неправильно это понять, и я также не уверен, что это определение хорошо транслируется на C # для этого конкретного обсуждения.

EDIT

Моя цель - точно понять, в чем заключаются проблемы ковариации или приведения типов с универсальными интерфейсами в C #. Примеры, которые я опубликовал, - это мое понимание проблемы. Если все примеры компилируются / работают нормально, представьте пример, который воспроизводит наиболее распространенные проблемы ковариации / контравариантности / приведения типов в C #. Мне нужно это знать, чтобы я мог определить и объяснить проблему другим.

8
задан R. Martinho Fernandes 5 July 2011 в 10:48
поделиться