12

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

.NET v2 中引入的来自的泛型CreateInstance方法System.Activator对泛型参数没有类型限制,但需要激活类型的默认构造函数,否则MissingMethodException会抛出 a。对我来说,这个方法似乎很明显应该有一个类型约束,比如

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() 约束的通用方法的类型参数。在这种情况下,给定的答案似乎是不限制方法的唯一正当理由......

感谢您查看此内容!

4

1 回答 1

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>上面的类将需要该约束,这将过于严格,因为Create它是一个虚方法,并且某些派生类可能希望使用不同的实例化方式,例如调用类型的内部构造函数或使用静态构建器方法。

于 2011-03-03T23:30:14.940 回答