Что делает 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));
}