Если вы углубитесь в исходный код, вы увидите, что Lazy<T>
в конечном итоге использует Activator
:
return new Lazy<T>.Boxed((T)Activator.CreateInstance(typeof(T)));
Это просто ярлык для использования отражения. Поскольку это не создание экземпляра типа через фактический аргумент универсального типа (new T()
), а скорее вызов конструктора посредством отражения, ограничение where T : new()
не требуется.