В приведенном ниже примере кода метод 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
в универсальном методе без ограничения, напрямую используя ту же самую базовую инфраструктуру