Имя: Пароль:
IT
 
C# generics. Ограничение на конструктор с параметрами
0 Ненавижу 1С
 
гуру
19.10.10
16:16
Почему вот так можно
class A<T> where T:MyClass,new()
а так нет
class A<T> where T:MyClass,new(int)
Вопрос больше теоретический почему создатели не стали такое (конструктор с параметрами) допускать?
Тоже самое в Delphi, только так можно:
A<T:MyClass,constructor>=class
1 DmitrO
 
19.10.10
17:14
и снова "переходите на с++, там это реализовано" :)
class MyClass
{
public:
 MyClass(int n) {};
};

template<typename T>
class А
{
T* foo() { return new T(456); };
};
2 Ненавижу 1С
 
гуру
19.10.10
17:19
(1) generics<>templates
3 DmitrO
 
19.10.10
17:20
единственное что я не понял: почему ты пытаешься описать вызов конструктора в объявлении шаблонного класса (A), а не в том месте, где собственно и нужно сделать вызов этого самого конструктора для создания экземпляра класса MyClass.
4 Ненавижу 1С
 
гуру
19.10.10
17:21
(3) это не вызов, а ограничение на параметр
5 DmitrO
 
19.10.10
17:36
ну, а если убрать это ограничение на тип параметра шаблона?
6 DmitrO
 
19.10.10
17:40
у тебя же вот это:
where T:MyClass
уже означает что Т может быть либо непосредственно MyClass либо его наследник?
7 DmitrO
 
19.10.10
17:42
по документации where T : new() означает: "Аргумент типа должен иметь открытый конструктор без параметров."
8 Кириллка
 
19.10.10
17:53
(2)чй-то нет? очень даже равные понятия.
9 Кириллка
 
19.10.10
18:02
(0)молодец, прочитал про различия class/object :)

where - это же ограничение <типа>, а разве конструктор с параметром является <типом>?
10 Ненавижу 1С
 
гуру
20.10.10
08:17
(9) ппц, класс имеющий конструктор является типом
11 Ненавижу 1С
 
гуру
20.10.10
08:19
(8)templates менее безопасны чем generics
12 Ненавижу 1С
 
гуру
20.10.10
08:20
(6)(7) правильно
(5) убрать, тогда вызов конструктора T будет невозможен в generic-классе
одно из отличий template от generic
13 DmitrO
 
20.10.10
08:39
(12) тогда я не понимаю смысла этого ограничения
14 Кириллка
 
20.10.10
08:46
(10)типом является имя класса
15 Ненавижу 1С
 
гуру
20.10.10
08:46
(13) указать компилятору, что да, подсунутый класс-параметр будет реально иметь конструктор без параметра
если вы подсунете в качестве параметра класс без такого конструктора, то будет ошибка компиляции:

namespace ConsoleApplication1
{
   class Program
   {
       static void Main(string[] args)
       {
           A<B> a = new A<B>(); //ошибка, нет такого конструктора
       }
   }
   public class A<T> where T : new()
   {
   }
   public class B
   {
       public B(int x) { }
   }
}
16 Ненавижу 1С
 
гуру
20.10.10
08:48
(14) имени мало, тип класс обладает еще набором сигнатур методов, свойств и конструкторов
вот эта вся совокупность и есть тип класс
17 Ненавижу 1С
 
гуру
20.10.10
08:49
+(16) Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и выполнения операций.
wiki:Тип_данных
18 Кириллка
 
20.10.10
09:01
(16)к вышеописанной проблеме этот копипаст какое имеет отношение?
19 Ненавижу 1С
 
гуру
20.10.10
09:05
(18) в (16) кстати не копипаст, это мой ответ ответ на ваши высказывания
а вообще ушли в сторону
20 DmitrO
 
20.10.10
09:16
а так?
   public class MyClass
   {
       public MyClass(int n)
       {

       }

   }

   public class A<T> //where T: new()
   {
       public void foo()
       {
           //T item = new T(); // CS0304

           Type t = typeof(T);
           Type[] at = {typeof(int)};
           object[] ap = { 56 };
           T item = (T)t.GetConstructor(at).Invoke(ap);
       }
   }
21 Ненавижу 1С
 
гуру
20.10.10
09:20
(20) не люблю я рефлексию, приходится "внутро" лезть
а если такого конструктора не будет, тогда исключение?
22 DmitrO
 
20.10.10
09:30
(21) ну наверняка исключение, и похоже оно в рантайме будет
а в с++ оно было бы в дизайн тайме, при инстанцировании шаблона. Вот поэтомц я и не понимаю в чем смысл ограничения типа параметра шаблона на конструктор по умолчанию (where T: new()).
23 DmitrO
 
20.10.10
09:32
вероятно от того что инстанцирование шаблона идет в рантайме, ну не совсем в рантайме, а как там у вас, при запуске программы при CLR компиляции.
24 DmitrO
 
20.10.10
09:44
хотя нет.. тогда получается, что компилятор C# создаст явно не работающую программу, это врядли..
значит инстанцирование идет именно непосредственно в рантайме.
я просто не знаю точно как там компиляция идет..
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс