![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| V0fka |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Привет!
В одной книге был примерчик. Для меня был не совсем понятен, я решил поковыряться с ним. В общем есть такой код:
И на строке private List<T1> TestGeneric<T2>(T2 param) where T2 : Test2 студия ругается "Не удалось найти имя типа или пространства имен "Т1" (пропущена директива using или ссылка на сборку?)". Пример притянутый за уши, интересно разобраться именно с таким случаем. Если сделать, чтобы в методе TestGeneric все обобщенные типы были одинаковые, т.е., например, так:
то ошибки нету. Но я хочу именно так, как написал: тип возвращаемого значения один, а тип входного параметра другой. Подскажите, пожалуйста, что оно хочет? |
||||
|
|||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Он хочет знать, что такое Т1... и мне, кстати, тоже интересно -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| dzaraev |
|
||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 12.1.2013 Репутация: 1 Всего: 1 |
Во-первых у вас метод отклеился у вас метод объявлен вне класса
Во-вторых, если этот метод должен был быть в классе MainWindow например, то ему необходимо добавить в объявление соответствующий параметр типа. Объявление метода TestGeneric должно выглядеть примерно так:
Далее, строка
даже при наличии параметра T1 не будет компилироваться, т.к. у вас не задано ограничение для параметра T1. Добавим его, объявление метода будет теперь выглядеть так:
Если вы хотите внутри тела метода создавать не конкретно Test1, а, например, писать new T1(), то вам необходимо добавить ограничение new(), тогда метод можно переписать вот так:
Подробнее об ограничениях параметров типа читайте тут: http://msdn.microsoft.com/ru-ru/library/d5x73970.aspx И последнее:
Этот код у вас тоже не скомпилится, т.к. теперь нам необходимо указывать два аргумента типа для метода TestGeneric, т.е. вы же добавили параметр T1, теперь же добавим и аргумент для него при вызове метода - будет вот так:
Если проблема решена - помечаем Это сообщение отредактировал(а) dzaraev - 24.9.2013, 07:11 --------------------
Если вопрос решён - помечайте тему. |
||||||||||||
|
|||||||||||||
| V0fka |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Я не знал, что
Думал, что где попало можно написать, компилятор догадается dzaraev, ответ - не просто ответ на заданный вопрос, а и ответ на будущие вопросы, которые бы возникли по этой теме Это получается, что все обобщенные типы должны быть обязательно перечислены возле объявления именно метода/класса? ПС. тему помечаю |
|||
|
||||
| jsharp36 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.10.2011 Репутация: нет Всего: 1 |
Э... Из кода только догадываться, что произошло. dzaraev верно пишет, но есть еще одна лазейка. Если этот код вырван из какого-то класса уже, то тогда метод "не отклеился". Возможно вы переписали код из книги, который описывал только кусок класса. Тогда возможно и сам класс был обобщенного типа и уже в описании этого класса есть T1. И все выводы dzaraev-а переносятся на описание параметра в классе, а код, как кусок, не является неправильным.
Но скорее всего, код не верный вообще, т.к. сначала создается пустой класс MainWindow, а потом, судя по имени - обработчик кнопки. Если тот гипотетический внешний класс не является формой да еще обобщенной, то скорее всего, просто когда писали класс MainWindow, неудачно случайно закрыли скобку )) Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
| jsharp36 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.10.2011 Репутация: нет Всего: 1 |
А, нет, сори, Test2 тогда был бы описан внутри этого класса.
Но в общем, идея такая, что не обязательно описывать в методе самом оба обобщенных параметра, а часть может быть описана в классе, в котором этот метод находится. Тогда, тип задается при создании экземпляра. А при вызове метода указывается второй. Тогда не надо столько кода переписывать. Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
| V0fka |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
jsharp36, спасибо за ответ, сказанное вами прийму к сведению
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |