![]() |
Модераторы: 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. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |