В приведенном ниже примере кода метод CompileError не будет компилироваться, поскольку для него требуется ограничение where T : new(), как показано в методе CreateWithNew(). Однако метод CreateWithActivator<T>() компилируется просто отлично без ограничения.
public class GenericTests
{
public T CompileError<T>() // compile error CS0304
{
return new T();
}
public T CreateWithNew<T>() where T : new() // builds ok
{
return new T();
}
public T CreateWithActivator<T>() // builds ok
{
return Activator.CreateInstance<T>();
}
}
Почему это?
Согласно qaru.site/info/204559/..., который ссылается на документацию MSDN и этот вопрос, выражение new T() в дженериках фактически реализовано с помощью Activator.CreateInstance<T>(). Поэтому я не понимаю, почему вызов new T() требует, чтобы общий тип был ограничен таким образом, который можно опустить при использовании Activator.CreateInstance<T>().
Или, чтобы поставить вопрос наоборот: какая точка ограничения where T : new(), если легко создать экземпляры T в универсальном методе без ограничения, напрямую используя ту же самую базовую инфраструктуру