c# - 琐事多于真正重要 : Why no new() constraint on Activator. CreateInstance<T>()?

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

我想有人可以回答这个问题,这是出于好奇而提出的问题:

System.Activator 中的通用 CreateInstance 方法在 .NET v2 中引入,对通用参数没有类型限制,但确实需要激活类型的默认构造函数,否则将抛出 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/

相关文章:

c# - "as"关键字在内部是如何工作的?

c++ - CoInitializeSecurity 在禁用 clr 选项时失败

c# - 使用Lock来停止并发执行不起作用?

c# - 如何使用 MySQL Connector/NET 在深度超过 2 的对象图上使用 Entity Framework?

mysql - 在 ASP.NET 中使用一个应用程序连接两个不同的数据库

.net - ClickOnce 部署 CheckForDetailedUpdate 抛出异常

c# - Realm 数据库异步查询和.Net

c# - 从 C# 中的数据集绑定(bind)项目后,在组合框中插入项目

c# - 从另一个列表创建一个列表

c++ - 将 null 从 C++/CLI 发送到托管 C#