ПредишенСледващото

Термините "ковариантните" и "contravariance" се отнася до способността за използване на вида на по-малка или по-голяма дълбочина на наследството, отколкото първоначално е посочено. параметри генерични тип поддържат covariant и contravariant и осигуряват по-голяма гъвкавост при определянето и използването на основни видове. Изброените по-долу определения на термините "ковариация", "contravariance" и "неизменна" в контекста на системата за типово. Този пример предполага присъствието на основа клас име база и получени клас на име Получена.

Тя позволява използване вид наследство с по-голяма дълбочина, отколкото е посочено в началото.

Един пример за IEnumerable (IEnumerable (на производни) в Visual Basic) може да се причисли към променлива от тип IEnumerable.

Позволява използването на генерични тип (с по-плитка дълбочина на наследството), отколкото първоначално е посочено.

Един пример за IEnumerable (IEnumerable (база) в Visual Basic) може да се причисли към променлива от тип IEnumerable.

Това означава, че можете да използвате само определени първоначално тип. По този начин, инвариантен родово тип параметър е нито covariant нито contravariant.

Един пример за IEnumerable (IEnumerable (база) в Visual Basic) не може да се причисли към променлива от тип IEnumerable. и обратно.

параметри covariant тип ви позволяват да се създаде дестинация, която много прилича на нормален полиморфизъм (Ръководство за програмиране C #). като следния код.

Това може да изглежда като крачка назад, но това е тип-безопасно код, който събира и управлява. Ламбда съответства възлага, която се обозначава, и определя метода, който се един параметър от тип основа и няма стойност връщане. Получената делегат може да бъде назначен променлива от тип действие. от тип параметър Т делегат действие на Това е contravariant. Кодът е тип-безопасно, тъй като Т определя типа на параметъра. Когато делегата на тип действие Той повика, сякаш е делегат на тип действие. аргумента си, трябва да бъде аргумент от тип Извлечен. Този аргумент не може винаги да бъде безопасно прехвърля към основния метод, тъй като параметър на метода е параметър от тип Base.

Като цяло, covariant тип параметър може да се използва като тип за връщане на делегата и параметри contravariant тип могат да бъдат използвани като вида на параметрите. Интерфейс параметри за covariant тип могат да бъдат използвани като тип за връщане на методи интерфейс и параметри contravariant тип могат да се използват като методи видове параметри интерфейс.

Заедно ковариация и contravariance нарича вариация. параметър общият вид, който не е маркиран като covariant или contravariant се нарича инвариант. Кратка информация за промяната в общата езикова среда:

В .NET рамка 4, следните интерфейси и видовете делегатски са covariant и / или contravariant параметри тип.

Въведете универсален интерфейс или универсален метод делегат може да има covariant както и параметри contravariant тип.

Колебания се прилага само за референтни типове; Ако зададете тип стойност за параметър тип вариант, който параметър тип е инвариант на вида създадени като резултат.

Колебания не е приложимо към делегатите на съюза. Следователно, за две дадени упълномощени тип действие и действие (Действие (на производни) и действие (база) в Visual Basic), не може да се комбинира с първия делегат на втория, въпреки факта, че резултатът ще бъде безопасен вид. Променливостта позволява определянето на променлива действие втори тип делегат. но делегатите могат да се комбинират само ако типа им съвпадат напълно.

Следващите раздели описват подробно covariant и параметри contravariant тип.

В .NET рамка 4, следните интерфейси и видовете делегатски са covariant и / или contravariant параметри тип. UI Automation ядро ​​от маски всякакви разлики в структурите, принадлежащи към различни части от потребителския интерфейс. Това означава, че упълномощени да бъдат причислени към променливи, производни, притежаващи повече видове параметри, и (в случай на универсални методи упълномощени функции) по-малко производни връщат видове.

Последният параметър на общ тип генерични методи упълномощени Func показва вида на стойността на връщане в подпис делегат. Той е covariant (ключова дума си), докато останалата част от параметрите на генерични тип са contravariant (ключова дума в).

Това е илюстрирано в следната код. Първата част от кода горе е дефиниран клас Base. клас на име Извлечен. клас наследява от Base. и още един клас с метод като статични (Споделено в Visual Basic) и името на MyMethod. Този метод отнема инстанция на базата и връща инстанция на класа Derived. (. Ако аргументът е инстанция на производни метод MyMethod го връща, а ако аргументът е пример за метод Base MyMethod връща нова инстанция на класа Derived ..) В Главна () функция пример създава инстанция на Func (Func (Of Base, Извлечен) в Visual Basic), което представлява метод MyMethod. и тя се съхранява в променлива f1.

Започвайки с .NET Framework версия 2.0 платформа, CLR среда подкрепя вариант бележки за параметрите на генерични тип. Предишните версии .NET Framework 4 единственият начин за определяне на общ клас има такава бележка, е използването на езика MSIL или чрез съставяне клас използване Ilasm.exe програма (IL Assembler). или чрез въвеждането му в динамичен монтаж.

Covariant тип параметър е белязана от ключова дума (Out ключова дума в Visual Basic елементите + за монтаж MSIL Assembler). Covariant параметър тип може да се използва като стойността на връщане за принадлежност към интерфейс, или като тип връщане на делегата. Covariant параметър вид не може да се използва като общ вид ограничение за методи интерфейс.

Ако методът на интерфейса има параметър от тип универсален метод делегат, covariant тип параметър тип интерфейс може да се използва за определяне на параметър тип contravariant този тип делегат.

Contravariant параметър тип е маркиран с ключова дума в (В ключова дума в Visual Basic, ключовата дума - за монтаж MSIL Assembler). Contravariant тип параметър може да се използва като параметър тип метод, който принадлежи към интерфейса, или като тип параметър делегат. Contravariant тип параметър може да се използва като общ вид ограничение за метод интерфейс.

тип Параметри вариант може да има само вида интерфейс и видове делегатски. тип интерфейс или делегат тип може да има и двете covariant и contravariant параметри тип.

Езици Visual Basic и C # не позволява да се нарушават правилата за използване на параметрите covariant и contravariant тип или да добавят бележки или contravariance ковариантните параметри по вид с различна от типа интерфейси и делегати. UI Automation ядро ​​от маски всякакви разлики в структурите, принадлежащи към различни части от потребителския интерфейс.

Подкрепете проекта - споделете линка, благодаря!