2010-03-15 2 views
4

Я пытаюсь понять constraints об общих параметрах типа в C#. Какова цель ограничения where T : new()? Зачем вам нужно настаивать на том, что аргумент типа имеет открытый конструктор без параметров?Когда важно иметь открытый конструктор без параметров в C#?

Редактировать: Мне что-то не хватает. Самый высокий рейтинг говорит, что для создания типичного типа необходим открытый безпараллельный конструктор. Если это так, то почему этот код компилируется и запускается?

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //class Foo has no public parameterless constructor 
      var test = new genericClass<Foo>(); 
     } 
    } 

    class genericClass<T> where T : new() 
    { 
     T test = new T(); //yet no problem instantiating 
    } 

    class Foo 
    { 
     //no public parameterless constructor here 
    } 
} 

Edit: В своем комментарии, Гейбы напомнили мне, что если я не определить конструктор, компилятор обеспечивает один без параметров по умолчанию. Итак, класс Foo в моем примере фактически имеет открытый конструктор без параметров.

+7

Не забывайте, что если вы не укажете каких-либо конструкторов, вы получите стандартный конструктор без параметров по умолчанию. – Gabe

ответ

12

Если вы хотите создать экземпляр нового T.

void MyMethod<T>() where T : new() 
{ 
    T foo = new T(); 
    ... 
} 
+1

@Frank: Вы не можете наследовать от параметра общего типа. –

+0

Поскольку мой неполный ответ получал много вариантов, я сделал это сообщество wiki. Пожалуйста, не стесняйтесь обновлять его, чтобы сформировать более полный ответ. – Greg

+0

@Greg, как узнать об объекте 'Type', чтобы на нем был открытый конструктор без параметров? – Shimmy

1

Это необходимо всякий раз, когда какой-либо метод создает объект типа T.

0

Когда бы вы хотели написать new T(); внутри общего метод/класса вам нужно это ограничение так T create<T>(/*...*/) вероятно, потребуется его

4

Кроме того, я считаю, что сериализации требуют открытого конструктора без параметров ...

+0

Вернее: десериализация. Я не думаю, что сама сериализация имеет какие-либо конструкторские требования. – Amy

2

Я не знаю о serizlization, но могу сказать, что COM-объекты требуют конструктора без параметров, поскольку параметрические конструкторы не поддерживаются, насколько я знаю.

Смежные вопросы