Когда важно иметь открытый конструктор без параметров в C #? - PullRequest
4 голосов
/ 15 марта 2010

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

Edit: Я должен что-то упустить. Ответ с наивысшим рейтингом говорит, что открытый конструктор без параметров необходим для создания экземпляра универсального типа. Если это так, почему этот код компилируется и запускается?

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
    }
}

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

Ответы [ 5 ]

12 голосов
/ 15 марта 2010

Если вы хотите создать новую T.

void MyMethod<T>() where T : new()
{
  T foo = new T();
  ...
}
4 голосов
/ 15 марта 2010

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

2 голосов
/ 15 марта 2010

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

1 голос
/ 15 марта 2010

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

0 голосов
/ 15 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...