Описание тега covariance
О заказе типов
Допустим, что класс P (родительский) наследуется классом C (дочерним).
Мы можем обозначить этот факт как: P > C.
Неформально P "больше", чем C, поскольку он "содержит" все возможные экземпляры C, но может также содержать некоторые другие экземпляры, которые не являются C. Ребенок всегда является родительским, но не обязательно наоборот.
Разница в дженериках
Предположим, что существует универсальный тип G, который имеет единственный универсальный параметр T, обозначаемый: G{T}.
- Если G{P} > G{C}, то Т со -варианта (она сохраняет исходное упорядочение наследования).
- Если G {P}
противопоказан -вариант (это меняет исходный порядок наследования). - Если G {P} и G {C} не связаны с типом, то T инвариантен (он "нарушает" наследование).
Таким образом, дисперсия - это свойство преобразования (в данном случае: общий параметр T группы G), а не исходная иерархия типов (P и C).
Примеры C#
Общий параметр T IEnumerable<out T>
является ковариантным (как обозначено ключевым словом out), что означает, что вы можете "забыть", что коллекция содержит C s, и просто рассматривать ее, как если бы она содержала Ps. Например:
IEnumerable<C> ec = ...;
IEnumerable<P> ep = ec;
Общий параметр T Action<in T>
контравариантен (как обозначено ключевым словом " in "), что означает, что действие, которое принимает P, также может принимать C. Например:
Action<P> ap = ...;
Action<C> ac = ap;
Общий параметр T является контравариантным, а универсальный параметр TResult ковариантен в Func<in T, out TResult>
. Каждый общий параметр считается отдельным "преобразованием" со своей собственной дисперсией. Это позволяет вам написать такой код:
Func<P, C> fpc = ...;
Func<C, P> fcp = fpc;
И, наконец, общий параметр T IList<T>
считается инвариантным, поэтому IList<P>
а также IList<C>
считаются несвязанными типами (нет совместимости по присваиванию ни в одном из направлений).
Использование тегов
- Как не использовать ковариации для измерения силы и направления линейной зависимости между двумя случайными величинами (статистический контекст). Вместо этого используйте другие связанные теги, например, статистику.
Более того, подумайте, может ли вопрос лучше подходить для Cross Validated, сайта Stack Exchange для статистики, машинного обучения и анализа данных.