Главная » Просмотр файлов » Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)

Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 88

Файл №1160865 Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)) 88 страницаНэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865) страница 882019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 88)

Однако обратите внимание, что сразу после этого первый элемент оЬб есся был заменен некоторым экземпляром оЬб ест. Что произойдет в результате второго вызова О1яр1ауЯст1поя с передачей ему массива ятт1пдя? Как и можно было догадаться, исполняющая система сгенерирует исключение типа АттауТуреМ1ящасспехсерс тоси Оппапб1еб ехсерстоп: Буясещ.лттаутуремтзщассьехсерс1оп: Ассещрсеб со ассеяя ап е1ещепт ая а Суре 1псощрас1Ь[е итсь Ссе актау.

Необработанное исключение: БуяСещ.АттауТуреМбящаСсЛЕхсерстол: Попытка обращения к элементу с типом, который несовместим с массивом. Ковариантность массивов в СЗ присутствует изначально для совместимости с языком дача. Но поскольку она несовершенна, а некоторые даже утверждают, что дефектна, как устранить эту проблему? На самом деле существует несколько путей. Те иэ вас, кто знаком с функциональным программированием, естественно предложат в качестве решения инвариантность. То есть, если массив инвариантен, подобно Яуясещ.

ЯСС1по, то в точке, где он присваивается другой переменной, происходит копирование обычным образом, т.е. в "ленивой" манере. Однако давайте посмотрим, как можно решить эту проблему с использованием обобщений: па[ад Буятещ; пя1по Буятещ.со11естсопя.бепет1с; ятаС1с с1аяя ЕпСтуРо1пт ( яСаттс чо1б Мата() ( 11ят<ятт1ПО> ятт1ПОя = ПЕИ 11яС<яст1ПО> ( "ОПЕ", "ТЧО", "ТЬСЕЕк )~ 334 Глава П // Эео ке скомпквяруееоя![! ьавв<оъ9еое> оь5еоев = ввгапдв; Приведенный фрагмент кода по духу идентичен примеру с коварнантностью массивов.

Тем не менее, он не скомпилируегся. Компилятор выдаст следующее сообщение об ошибке: еггог 000029: саппог Тшр11саг1у соптегг гуре 'Бувгеш.со11всг1опв.зепеггс. ьгвг<вггапя>' го 'Буало.со11есг1опв.зепег1с.11вг<оь)есг>' ошибка СБ0029: Не удается неявно преобразовать тнп Бувавт.Со11ессхопа. Бепегас.11вг<вгг1пд> в Бувгеш.со11есгаопв.Бапегас.гавг<оьуесг> Суть проблемы в том,что каждуай сконструированный тип является индивидуальным типом, и несмотря на то, что они могут происходить от одного обобщенного типа, между ними нет неявной связи. например, неявного отношения между 1.1вг<вгг1пд> и 11вг<оь) есс> не существует, и только то, что оба они сконструированы на основе ьгзг<т>, а вступи неявно преобразуется в оь) есг, не означает, что они преобразуемы друг в друга.

Однако не теряйте надежды. В С№ 4.0 появился синтаксис. который позволяет достигнуть нужного результата. Используя этот новый синтаксис, можно обозначить, что обобщенный интерфейс или делегат поддерживает ковариантность или контравариантность. Вдобавок новые правила вариантности касаются только сконструированных типов, которым ссылочные типы передаются в виде аргументов обобщенного типа. Коаариантность Внутри строго типизированного языка программирования, которым является С№, операция ковариантна, если отображает и предохраняет порядок типов — от более специфичных к более обобщенным.

Для целей иллюстрации позаимствуем пример из предыдущего раздела, чтобы показать ковариантность правил присваивания массивов в С№: вагапа в = "Не11о"; оЬ1есс о = в; всгапд[! впггпдв пеи впг1пч[3! оЬ)все[) оЬ1еспв = всг1пчв! Первые две строки имеют четкий смысл: в конечном итоге, переменные типа всг1пд неявно преобразуемы в тип оь) есг, поскольку тип вгг1пс унаследован от оьб есг.

Второй набор строк показывает, что переменные типа вгг1пд [) неявно преобраэуемы в переменные типа оЬ) есп [) . И поскольку порядок типов между двумя неявными присваиваниями идентичен, те. от более специализированного типа [в Гг1по) к более общему типу [оЬ) есг), можно говорить о ковариантности операции присваивания массивов. Теперь, чтобы транслировать эту концепцию в область присваивания обобщенных интерфейсов, интерфейс типа 10регасьоп<Т> является ковариантно преобразуемым в 10регасгоп<Н>. если существует неявное преобразование ссылок от Т к Н и от 10регаггоп<т> к 10регаггоп<н>. Проще говоря, если для только что упомянутых операций преобразования Т и Н находятся на одной и той же стороне операции, значит, эта операция ковариантна.

Например, представим операцию преобразования с помощью стрелки. Так как Т и Н в обоих случаях появляются на одной и той же стороне операции, значит, операция по своей природе коварнантна: Т -+ Р 10регасьоп<Т> -+ 10регасьоп<Н> Обобщения 336 Нв заметку! Правила вариантности СЗ неприменимы к типам значений, т.е. к типам, которые не преобразуются в ссылки.

Другими словами, тип 1Орегзстоп<1пс> не является ковариантно преобразуемым в 10регэс1оп«(ооЬ1е>, даже несмотря на то, что Епс неявно преобразуется в <(осЬ1е. Давайте рассмотрим пример, в котором имеется специальная коллекция по имени МуСо11есстоп<Т>, реализующая интерфейс 1МуСо11ессуоп<Т>: пз1пд Яузгепг пэ1пд Буэгеп.Со11есгьопз.Селе<то; ) ЕЕггзСе 1Мусо11есг1оп<Т> ( чоха Аг)г(1сеп( Т хтеп ); Т Сег1геп( 1пг Епоех ); ) с1азз МуСО11Есгтоп<Т>: 1МуСо11есстоп<Т> ( рпЬ11с чотп Аг)о1геп( Т Егеп ) ( со11есг1оп.Аг(г(( 1геп )г рпв11с Т Сес1геп( Епг Еппех ) ( гегпгп со11есстоп(1паех); ) ргэчаее ьузг<т> со11есг1оп = пен ьтзе<т>(); ) зтаттс с1ззз ЕптгуРо1пг ( згагтс тоьб Ма1п() ( чаг зггтпзэ = пен МуСо11есстоп<зпгзпд>(); эсгтпдэ.АСС1геп( пэпе" зтгтпоз.АСС1геп( "Тно" ); 1МуСо11ессьоп<зсг1пд> со118пг1поз = зсг1псз; РгтпССо11есстоп( со11экг1поз, 2 )г ) згзгас чоэб РгапЕСо11есгьоп( 1Мусо11есг1оп<зпг1по> со11, Епг соипс ) ( Еог( Епг х Сг 1 < сопппг ЕЕЕ ) ( Сопэо1е.нгьсеьапе( со11.6ег1геп(1) ); ) Конечно, коллекция мусо11ессьоп<т> очень надуманна, и вряд ли бы тип коллекций подобного рода создавался в реальных приложениях.

Однако она представлена таким образом, чтобы сохранить пример кратким и сосредоточиться на ковариантностн. Этот код нормально компилируется и выполняется, выводя на консоль две строки из экземпляра Мусо11есс1оп<з Сг1по>. Но теперь давайте предположим, что метод РгапССо11еспаоп должен принимать экземпляр типа МуСо11есС1оп<оЬбесс> вместо МуСо11есп1оп<зпг1п1т>. В конце концов, логично, что коллекция зпг1по также является коллекцией оЬб асс. Если просто изменить сигнатуру Рг1пЕСа11есс1оп для приема МуСо11еспуоп<оЬ1ест>, то в точке вызова возникнет ошибка компиляции.

Причина в том, что нечто, логичное для программиста, вовсе не обязательно будет логичным для компилятора, поскольку по умолчанию сконструированные обобщенные типы инвариантны. и не существует неявного преобразования одного в другой. Необходимо что-то 336 Глава ) ) еще. Удостоверьтесь, что приведенная ниже модификация кода компилируется и работает ожидаемым образом.

Заслуживающие внимания отличия выделены полужирным. пз1пд Яуяхехц пя1пд Яуяхеа.со11есх1опя.цепеггс) гпхехТзсе 1муСо11есх1оп<Т> ( чохс( Аоо1хев( Т 1хев )г Епеегуасе 1муеппвегассх<сие т> ( Т ЦесТЕев( 1пе 1пя(ек ) ) с1аяз мусо11есг1оп<т>: 1мусо11есг1оп<т>, 1муеппаехзгог<т> ( рпвьгс чогб Ася(1хев( Т 1хеа ) ( со11есг1оп.лс)с( 1гет )) ) рпвьгс Т Яех1хет( гпх 1п<(ех ) ( хехпхп со11есх1оп(1псех)л ) рхгчзге 11яг<т> со11есгаоп = пез 11яг<т> О л яхах1с с1аяя Епххурогпх ( ягаггс чо1й магп() чах яхг1пся = пее МуСо11есх1оп<яххгпд> О; яхг1поя.ля(П1хев( "Опе" яхг1псз.Ая(<(1хев( "Тзо" ); 1мувппвегзхох<яхх1пд> со11Ягг1поя = зххгпоял // Еовариавввосеь в дейсввии( 1муепозмгаеог<сь1есе> сс110ь1ессз = со11ясгапдз; РхгпГСо11есхгоп( со110Ьбесхя, 2 ); ) яхах1с чогб РхгпхСо11есхгоп( 1мувппаегагог<оЬ)есх> со11, 1пх сопля гох( гпх г = Ол г < соппхл яег Сопяо1е.кх1хев1пе( со11.0ехгхет(г) ) ) Для начала обратите внимание, что предыдущая реализация 1МУСо11есхгоп разделена надва интерфейса с именами 1МуСо11есхгоп и 1МуЕппаехахог.

Объяснения будут даны ниже. Также обратите внимание, что Рг1пгсо11есг1оп принимает переменную типа 1муЕпптегахог<оЬ)есх> вместо 1муЕппаегахог<зхг1пд>.Но что более важно, присмотритесь внимательнее к объявлению 1муепптехагох<т>, особенно к способу декорнрования параметра обобщения с помощью ключевого слова опг.

Ключевое слово опх в списке параметров обобщения — это способ указания, что обобщенный интерфейс ковариантен в Т. Другими словами, подобным образом компилятору сообщается, что если Е неявно преобразуется в Я, то также и 1ауЕппшехахог<И> неявно преобразуется в 1туЕппаегахох<Я>. Почему ключевое слово названо опГР Потому, что так случилось, что обобщенные интерфейсы, которые ковариантны в Т, обычно имеют т в выходной позиции принадлежащих им методов. Теперь должно быть понятно, почему первоначальный интерфейс 1мусо11есг1оп был разделен на два интерфейса — потому что метод 1муСо11есх гоп . А<)01 Ген не содЕРжит т в выходной позиции.

Обобщения 337 Ма заметку! Ключевые слова 1п и опщ скорее всего, были выбраны командой разработчиков компилятора из-за того, что, как показано выше, ковариантные интерфейсы имеют вариантный тип в выходной позиции, и наоборот — для ковариантности. Однако в последующих разделах будет показано, что этот упрощенный вид становится довольно запутанным, когда подключаются функции (или функционалы) более высокого порядка.

с выходом св 4.0 давно известные типы 1еппвегаь1е<т> и 1епувегасог<т> обозначены как ковариантные с помощью ключевого слова опг. Это очень помогает, особенно при работе с Ы)))Я. Контравариантность Как и можно было ожидать, контравариантность — это противоположность ковариантности.

То есть для присваивания обобщенного интерфейса интерфейс типа 10регагзоп<Т> контравариантно преобразуем в 10регагуоп<Е>, ЕСли СуЩЕСтВует Неявное преобразование из е в т и из 10регасзоп<т> в 10регагфоп<е>. Проще говоря, если для обоих преобразований Т и Е находятся на противоположных сторонах операции преобразования, то операция контравариантна. Например, представим операцию в виде стрелки.

Поскольку Т и Е находятся на противоположных сторонах операции в обоих случаях, такая операция по природе своей контравариантна. Е -+ Т 10регасзоп<т> -+ 1орегасзоп<е> Контравариантные обобщенные параметры в обобщенных интерфейсах и делегатах помечаются с использованием новой декорации обобщенных параметров Тп. Чтобы проиллюстрировать это, давайте вернемся к надуманному классу мусо11ессзоп<т> из предыдущего раздела, и предположим, что нужна возможность удаления элемента из коллекции. Интересующие фрагменты кода выделены полужирным.

Характеристики

Тип файла
DJVU-файл
Размер
8,22 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Нэш Трей - C# 2010
Accelerated_C_2010-4565
3_syntax_overview
3_generics_1.cs
as_1.cs
boxing.cs
conversions_1.cs
implicit_type_1.cs
is_1.cs
references_1.cs
references_2.cs
references_3.cs
values_1.cs
4_classes_structs
4_abstract_classes_1.cs
4_beforefieldinit_1.cs
4_box_1.cs
4_box_2.cs
4_box_3.cs
4_box_4.cs
4_box_5.cs
4_class_definition_1.cs
4_compareto_1.cs
4_containment_example_1.cs
4_containment_example_2.cs
4_containment_example_3.cs
4_ctor_struct_1.cs
4_ctor_struct_2.cs
4_ctor_struct_3.cs
4_destructor_1.cs
4_destructor_2.cs
Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7056
Авторов
на СтудИзбе
258
Средний доход
с одного платного файла
Обучение Подробнее