C# generics. Ограничение на конструктор с параметрами #511752


#0 by Ненавижу 1С
Почему вот так можно class A<T> where T:MyClass,new а так нет class A<T> where T:MyClass,new(int) Вопрос больше теоретический почему создатели не стали такое (конструктор с параметрами) допускать? Тоже самое в Delphi, только так можно: A<T:MyClass,constructor>=class
#1 by DmitrO
и снова "переходите на с++, там это реализовано" :) class MyClass { public:  MyClass(int n) {}; }; template<typename T> class А { T* foo { return new T; }; };
#2 by Ненавижу 1С
generics<>templates
#3 by DmitrO
единственное что я не понял: почему ты пытаешься описать вызов конструктора в объявлении шаблонного класса (A), а не в том месте, где собственно и нужно сделать вызов этого самого конструктора для создания экземпляра класса MyClass.
#4 by Ненавижу 1С
это не вызов, а ограничение на параметр
#5 by DmitrO
ну, а если убрать это ограничение на тип параметра шаблона?
#6 by DmitrO
у тебя же вот это: where T:MyClass уже означает что Т может быть либо непосредственно MyClass либо его наследник?
#7 by DmitrO
по документации where T : new означает: "Аргумент типа должен иметь открытый конструктор без параметров."
#8 by Кириллка
чй-то нет? очень даже равные понятия.
#9 by Кириллка
молодец, прочитал про различия class/object :) where - это же ограничение <типа>, а разве конструктор с параметром является <типом>?
#10 by Ненавижу 1С
ппц, класс имеющий конструктор является типом
#11 by Ненавижу 1С
templates менее безопасны чем generics
#12 by Ненавижу 1С
правильно убрать, тогда вызов конструктора T будет невозможен в generic-классе одно из отличий template от generic
#13 by DmitrO
тогда я не понимаю смысла этого ограничения
#14 by Кириллка
типом является имя класса
#15 by Ненавижу 1С
указать компилятору, что да, подсунутый класс-параметр будет реально иметь конструктор без параметра если вы подсунете в качестве параметра класс без такого конструктора, то будет ошибка компиляции: 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 by Ненавижу 1С
имени мало, тип класс обладает еще набором сигнатур методов, свойств и конструкторов вот эта вся совокупность и есть тип класс
#17 by Ненавижу 1С
+ Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и выполнения операций.
#18 by Кириллка
к вышеописанной проблеме этот копипаст какое имеет отношение?
#19 by Ненавижу 1С
в кстати не копипаст, это мой ответ ответ на ваши высказывания а вообще ушли в сторону
#20 by DmitrO
а так?    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 by Ненавижу 1С
не люблю я рефлексию, приходится "внутро" лезть а если такого конструктора не будет, тогда исключение?
#22 by DmitrO
ну наверняка исключение, и похоже оно в рантайме будет а в с++ оно было бы в дизайн тайме, при инстанцировании шаблона. Вот поэтомц я и не понимаю в чем смысл ограничения типа параметра шаблона на конструктор по умолчанию (where T: new).
#23 by DmitrO
вероятно от того что инстанцирование шаблона идет в рантайме, ну не совсем в рантайме, а как там у вас, при запуске программы при CLR компиляции.
#24 by DmitrO
хотя нет.. тогда получается, что компилятор C# создаст явно не работающую программу, это врядли.. значит инстанцирование идет именно непосредственно в рантайме. я просто не знаю точно как там компиляция идет..
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С