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

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

感谢您的关注!

最佳答案

我可能是错的,但是我看到的主要好处是它使您可以执行以下操作:

// 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是一个虚拟方法,并且某些派生类可能希望使用其他实例化方法,例如调用类型的内部构造器或使用静态构造器方法。

关于c# - 比真正重要的: Why no new() constraint on Activator. CreateInstance <T>()更多琐事?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5187867/

10-10 22:14