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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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