Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> template class в C#, непонятки с C# 
V
    Опции темы
azesmcar
Дата 25.11.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Добрый день,

то ли у меня какие то проблемы с понятиями template, то ли проблемы у Visual Studio.
Почему этот код не компилируется? В чем проблема? Или микрософт решила что шаблоны нужно поддерживать но не до конца. В чем дело, не могу понять.

Код

    class Test<T>
    {
        public T p;
        public void CreateP()
        {
            p = new T();
        }
    };

    class Program
    {
        static void Main(string[] args)
        {
            Test<int> c = new Test<int>();
            c.CreateP();
        }
    }

Цитата

error CS0304: Cannot create an instance of the variable type 'T' because it does not have the new() constraint

заранее спасибо


Это сообщение отредактировал(а) azesmcar - 25.11.2007, 13:45
PM   Вверх
1stain
Дата 25.11.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 8
Всего: 40



замени 
p = new T();
на
p = default(T);
и будет тебе щасте


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
azesmcar
Дата 25.11.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Код

    class Test<T>
    {
        public T p;
        public void CreateP()
        {
            p = new default(T);
        }
    };


error CS1031: Type expected
PM   Вверх
Любитель
Дата 25.11.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Если просто прочитать то, то говорит компилятор - возникает простое желание написать:
Код

class Test<T> where T: new // надеюсь, с синтаксисом не ошибся :)


Что означает, что мы требуем что бы параметр T имел паблик-конструктор без аргументов.


--------------------
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 25.11.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Код

class Test<T> where T: new()
{
   public T p;
   public void CreateP()
  {
     p = new default(T);
  }
};



то же самое..а вообще, что за извращение? какого черта он проверяет что-то? Даже если я не вызываю функци CreateP.
Может мне в дальнейшем понадобиться еще функцию Clear() вызвать к примеру для одного из моих классов. Мне и ее прописать наверху? А где мощь шаблонов C++?

Добавлено через 6 минут и 56 секунд
Код

    class Test<T> where T: new()
    {
        public T p;
        public void CreateP()
        {
            p = new T();
        }
    };


вот так сработало smile


а как заставить его к примеру работать для string -а ?? Нужна к примеру функция String.IsAscii()
Код

    class Test<T> where T: new()
    {
        public T p;
        public void CreateP()
        {
            p = new T();
            bool i = p.IsAscii();
        }
    };


что еще надо сверху добавить?

Это сообщение отредактировал(а) azesmcar - 25.11.2007, 14:08
PM   Вверх
Любитель
Дата 25.11.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



azesmcar, создавай объект с помощью new и исполдьзуй where new. default в дженериках (как только что посмотре в МСДН  smile ) обозначает для референс-типов просто null smile

Цитата(azesmcar @  25.11.2007,  14:07 Найти цитируемый пост)
Может мне в дальнейшем понадобиться еще функцию Clear() вызвать к примеру для одного из моих классов. Мне и ее прописать наверху?

Ну не её, а интерфейс соответствующий по идее.

Цитата(azesmcar @  25.11.2007,  14:07 Найти цитируемый пост)
А где мощь шаблонов C++?

В С++. А в С# - мощь дженериков C# smile


--------------------
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 25.11.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата

Ну не её, а интерфейс соответствующий по идее.


а как это если не секрет?

пробовал так
Код

class Test<T> where T: System.String, new()


говорит error CS0701: 'string' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.

А что ему надо то?
PM   Вверх
Любитель
Дата 25.11.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Цитата(azesmcar @  25.11.2007,  14:24 Найти цитируемый пост)
А что ему надо то?

Он же откровенно признался:
Цитата(azesmcar @  25.11.2007,  14:24 Найти цитируемый пост)
a non-sealed class

smile



--------------------
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 25.11.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Form он принял, а string нет..видимо string - sealed class.

честно говоря не проверял..надо проверить smile

проблема во всяком случае решена, спасибо
PM   Вверх
Любитель
Дата 25.11.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Цитата(azesmcar @  25.11.2007,  14:07 Найти цитируемый пост)
 bool i = p.IsAscii();

Упс. Не заметил :(

Я не пойму - тебе нужны конкретно System.String? Тогда зачем дженерики? Если же нужно нечто с IsAscii (кстати, разве такое есть в System.String  smile ) - объявляй свой интерфейс. Для имеющихся классов с таким методоам - если надо, создавай адаптеры (если нет возможности изменить сам этот класс, или есть какие-то причины, не позволяющие это делать).

Добавлено через 1 минуту и 24 секунды
Цитата(azesmcar @  25.11.2007,  14:39 Найти цитируемый пост)
видимо string - sealed class

Я чего-т не пойму - у тебя МСДН нету? Да и в любом случае по метаданным string-а VS в состоянии разрулить и показать его объявление. В частности sealed.


--------------------
PM MAIL ICQ Skype   Вверх
tol05
Дата 25.11.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



azesmcar, генерики и шаблоны - это разные понятия. Никто нигде не говорит, что генерики - это шаблоны, а шаблоны - это генерики. А если кто-то и говорит - значит он не знает предмета вопроса.

С таким же успехом можно говорить, что int - это тот же string, но другой... А что, разве не так? 
Ведь и int, и string - это же типы данных? Ну, значит, одно и то же.
Или говорить, что массивы и перечисления - одно и то же... 

ну а отвечать на вопросы
Цитата(azesmcar @  25.11.2007,  13:24 Найти цитируемый пост)
А что ему надо то? 

Цитата(azesmcar @  25.11.2007,  13:07 Найти цитируемый пост)
что еще надо сверху добавить?

ИМХО вряд ли нужно и не полезно.... Нужно сначала почитать, что такое генерики вообще.

Как знающему (как я полагаю) С++, могу предложить тебе, azesmcar, почитать 
Overview of Generics in C++ 
или стандарт ECMA-334

вопросы отпадут сами собой.
----------------------------------------------------------------------------------------------------------------------------------------
Цитата(Любитель @  25.11.2007,  13:14 Найти цитируемый пост)
Ну не её, а интерфейс соответствующий по идее.

какой интерфейс? String поддерживает какие-нибудь интерфейсы, определяющие метод IsAscii() ?


============================================================================
P.S. Ну вы и поститесь, господа.... Как в чате.... Когда вы только ДУМАТЬ успеваете?  smile 

Это сообщение отредактировал(а) tol05 - 25.11.2007, 14:58


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Любитель
Дата 25.11.2007, 15:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Цитата(tol05 @  25.11.2007,  14:55 Найти цитируемый пост)
какой интерфейс? String поддерживает какие-нибудь интерфейсы, определяющие метод IsAscii() ?

Насчёт IsAscii конкретно:
Цитата(Любитель @  25.11.2007,  14:44 Найти цитируемый пост)
кстати, разве такое есть в System.String


Я говорил про другое (более общее):

Имеем sealed-класс, с некоторым методом someMethod. Хотим юзать его и кучу других классов с методом someMethod как параметр дженерика. Пишем интерфейс с этим меотдом, для своих классов указываем, что мол реализуем сей интерфейс, для не своих пишем адаптеры (реализующие этот интерфейс и имеющие паблик-конструктор с параметром типа адаптируемого класса). Так лучше? smile

Цитата(tol05 @  25.11.2007,  14:55 Найти цитируемый пост)
ДУМАТЬ

What is it?  smile 


--------------------
PM MAIL ICQ Skype   Вверх
tol05
Дата 25.11.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Если я правильно понял, ты имеешь в виду что-то типа следующего?
Код

//чужой
class A
{
   void someMethod(){}
}

//чужой
class B
{
   
}

//наш класс
class C
{
   void someMethod(){}
}

делаем
Код

interface IMyInterface
{
   void someMethod();
}
//Хоть А и реализовал, нужно все равно апгрейдить, иначе не протащим в генерик
class upgratedA: IMyInterface
{
   public upgratedA(A a)
   void someMethod(){}
}

class upgratedB : IMyInterface
{
   public upgratedB(B b)
   void someMethod(){}
}

class C  : IMyInterface
{
   void someMethod(){}
}

Да, это вариант, но ИМХО хлопотно.

и если классов будет 40-50, то картинка будет неказистая вообще. А через месяц нужно добавить какой-то функциональности в одну треть классов и для них тоже в генерике этот функционал вызывать. 
Что делать? Писать еще один интерфейс. Апгрейдить классы по новой. И какие? Только дорабатываемые или все? В остальных писать просто заглушки?

ИМХО проще реализовать нужный метод в самом генерике. А результаты работы этого метода будут зависеть  от реального типа, на котором построен генерик. И код проще будет, и типы подставлять легче.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Любитель
Дата 25.11.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Цитата(tol05 @  25.11.2007,  18:24 Найти цитируемый пост)
Да, это вариант, но ИМХО хлопотно.

Это классические адапторы smile Иногда нет другого выхода. Вообще, предлагаю закончить обсуждение - автор доволен, вопрос решён  smile 


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0728 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.