очевидно, что Foo<int>
является подтипом Foo<T>
Для вас, может быть, но не для меня.
Для меня огромная дыраэто разрывает в систему типов просто не приемлемо.Если вы хотите выбросить безопасность типа из окна таким образом, я бы предпочел использовать динамически типизированный язык, который на самом деле был разработан для этого материала.
Тот факт, что массивы являются ковариантнымихотя известно, что это нарушает безопасность типов, это достаточно плохо, но теперь вы хотите нарушить это для всего ?
Это относится к самой сути системы типов,Все, что делает система типов, это отклоняет программы .А из-за теоремы Райса эти отклоненные программы включают в себя программы с идеальной типизацией и безопасностью типов.
Это огромная стоимость.Убирая выразительность, мешая мне писать полезные программы.Чтобы оправдать эту стоимость, систему типов лучше заплатить, вернувшись большое время .У него есть два основных способа сделать это: вернуть выразительность на уровне типов, который он убрал на уровне программ, и безопасность типов.
Первый вариант отсутствует, просто потому, что система типов C # не является мощной.достаточно, чтобы я мог выразить что-нибудь даже отдаленно интересное.Это оставляет только последнее, и оно уже находится на довольно шаткой почве из-за null
, ковариантных массивов, неограниченных побочных эффектов, unsafe
и так далее.Делая универсальные типы автоматически ковариантными, вы более или менее полностью убираете последний оставшийся элемент безопасности типов.
Существует только очень мало случаев, когда S <: T ⇒ G<S> <: G<T>
действительно является типом-безопасный.(IEnumerable
является одним из таких примеров.) И, вероятно, одинаково много случаев, когда только S <: T ⇒ G<T> <: G<S>
является типобезопасным.(IObservable
, IComparer
, IComparable
, IEqualityComparer
.) Как правило, , ни G<S> <: G<T>
, ни G<T> <: G<S>
не являются типобезопасными.