Правила отклонений в C #

Точные правила для достоверности отклонений немного расплывчаты и не конкретны. Я собираюсь перечислить правила для того, что делает тип валидно-ковариантным, и прикрепить некоторые запросы и личные аннотации к каждому из этих правил.

Тип являетсядействительный ковариантно если это:

1) тип указателя или неуниверсальный тип.

Указатели и неуниверсальные типы не являются вариантами в C #, за исключением массивов и неуниверсальных делегатов. Общие классы, структуры и перечисления являются инвариантами. Я здесь?

2) Тип массива T [], где T допустимо ковариантно.

Так что это означает, что если тип элементаT массиваT[] является ковариантным (ссылочный или тип элемента массива), то массив является ковариантным, а если тип элемента инвариантным (тип значения), то тип массива является инвариантным. Массивы не могут быть контравариантными в C #. Я здесь?

3) Тип параметра универсального типа, если он не был объявлен как контравариантный.

Обычно мы говорим, что универсальный тип является вариантным для типа параметра, но для типового параметра он должен быть вариантным сам по себе. Это еще одна короткая форма, чтобы сказать это? например, универсальный типT<out D> ковариантен поD (следовательно, ковариантно верный), следовательно, мы можем сказать, что параметр типаD является ковариантно действительным. Я прав?

4) Созданный класс, структура, перечисление, интерфейс или тип делегата X могут быть допустимыми ковариантно. Чтобы определить, так ли это, мы проверяем каждый аргумент типа по-разному, в зависимости от того, был ли соответствующий параметр типа объявлен как ковариантный (out), контравариантный (in) или инвариантный (ни один). (Конечно, параметры универсального типа классов и структур никогда не будут объявлены «вне» или «внутри»; они всегда будут инвариантными.) Если параметр i-го типа был объявлен ковариантным, то Ti должен быть действительным ковариантно. Если он был объявлен контравариантным, то Ti должен быть действительным контравариантно. Если он был объявлен инвариантным, то Ti должен быть действительным инвариантно.

Это последнее правило, сверху донизу, крайне неоднозначно.

Мы говорим о дисперсии универсального типа по всем его параметрам типа in / out / invariant? По определению, универсальный тип может быть ковариантным / контравариантным / инвариантным по одному параметру типа за один раз. Быть ковариантным или инвариантным, в этом случае сразу по всем параметрам этого типа, не имеет никакого значения. Что бы это могло значить?

Двигаться вперед. Чтобы определить, является ли универсальный тип ковариантно допустимым, мы исследуем его аргументы типа(не тип параметров), Таким образом, если соответствующий параметр типа является ковариантным / контравариантным / инвариантным, то аргумент типа является действительным ковариантно / контрвариантно / инвариантно соответственно ...

Мне нужно, чтобы это правило было объяснено более подробно.

Редактировать: Спасибо, Эрик. С благодарностью!

Я прекрасно понимаю, что справедливо / инвариантно / инвариантно означает. Тип допустим ковариантно, если он определенно не является контравариантным, что означает, что он может быть инвариантным. прекрасно!

Для четвертого правила вы следуете процедуре определения того, является ли построенный универсальный тип действительным ковариантно, как определено в правиле. Но как определить, является ли аргумент типа, объявленный ковариантным (выходным), ковариантно допустимым?

Например, взамкнутый построенный интерфейс I {} изобщий интерфейс I {...}, не должен сам факт что тип аргументаobject объявлен какпараметр ковариантного типа (выход U) в объявлении общего интерфейса означают, что тип аргумента объекта является ковариантным? Я думаю, что это должно. Потому что это само определение ковариантности.

Также второе правило:

2) Тип массива T [], где T допустимо ковариантно.

Что значиттип элемента массиваT быть действительным ковариантно значит? Вы имеете в виду, что тип элементатип значения (инвариант в этом случае) или ссылочный тип (ковариант в этом случае)?

Потому что проекцияTT[] вариант только еслиT является ссылочным типом.

Ответы на вопрос(3)

Ваш ответ на вопрос