更多琐事而不是真正重要:为什么对Activator.CreateInstance <t>()没有new()约束?</t>

时间:2011-03-03 23:19:56

标签: c# .net clr c#-2.0 base-class-library

我认为有些人可能能够回答这个问题,这是一个出于好奇的问题:

.NET v2中引入的来自CreateInstance的通用System.Activator方法对泛型参数没有类型约束,但在激活类型上需要默认构造函数,否则MissingMethodException是抛出。对我而言,这个方法应该有类似

的类型约束
Activator.CreateInstance<T>() where T : new() {
   ...
}

潜伏在这里的遗漏或轶事?

更新

正如所指出的,编译器不允许你编写

private T Create<T>() where T : struct, new()
error CS0451: The 'new()' constraint cannot be used with the 'struct' constraint

但是,请参阅注释可以将结构用作指定new()约束的泛型方法的类型参数。在这种情况下,给定的答案似乎是不限制该方法的唯一正当理由......

感谢您查看此内容!

1 个答案:

答案 0 :(得分:8)

我可能错了,但我看到的主要好处是它允许你做这样的事情:

// Simple illustration only, not claiming this is awesome code!
class Cache<T>
{
    private T _instance;

    public T Get()
    {
        if (_instance == null)
        {
            _instance = Create();
        }

        return _instance;
    }

    protected virtual T Create()
    {
        return Activator.CreateInstance<T>();
    }
}

请注意,如果Activator.CreateInstance<T>有一个where T : new()约束,那么上面的Cache<T>需要这个约束,因为{{{ 1}}是一个虚方法,一些派生类可能想要使用不同的实例化方法,例如调用类型的内部构造函数或使用静态构建器方法。