|
|
|
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# создаст явно не работающую программу, это врядли..
значит инстанцирование идет именно непосредственно в рантайме. я просто не знаю точно как там компиляция идет.. |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |