Что делает new() в `where T: new()?`

Что делает new() в коде ниже?

public class A<T> where T : B, new()

Ответы

Ответ 1

Это ограничение на общий параметр вашего класса, что означает, что любой тип, который передается как общий тип, должен иметь конструктор без параметров.

Итак,

public class C : B
{
    public C() {}
}

будет действительным типом. Вы можете создать новый экземпляр A<C>.

Однако

public class D : B
{
   public D(int something) {}
}

не удовлетворяет этому ограничению, и вам не будет разрешено создавать новый экземпляр A<D>. Если вы добавили конструктор без параметров в D, он снова будет действительным.

Ответ 2

Ограничение new() означает, что T должен иметь открытый конструктор без параметров. Любые вызовы T() превращаются в вызовы различных перегрузок Activator.CreateInstance(). Более гибкий подход (скажем, если конструкторы нуждаются в аргументах или являются внутренними, а не общедоступными) заключается в использовании делегата:

public class A<T> where T : B
{
    public void Method(Func<T> ctor)
    {
        T obj = ctor();
        // ....
    }
}

// elsewhere...
public class C : B
{
    public C(object obj) {}  
}

public void DoStuff()
{
    A<C> a = new A<C>();
    object ctorParam = new object();
    a.Method(() => new C(ctorParam));
}