Я много слышал / читал о проблемах ковариации в 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 # для этого конкретного обсуждения.
Моя цель - точно понять, в чем заключаются проблемы ковариации или приведения типов с универсальными интерфейсами в C #. Примеры, которые я опубликовал, - это мое понимание проблемы. Если все примеры компилируются / работают нормально, представьте пример, который воспроизводит наиболее распространенные проблемы ковариации / контравариантности / приведения типов в C #. Мне нужно это знать, чтобы я мог определить и объяснить проблему другим.