c# - 泛型:何时使用 new() 作为类型参数的约束?

标签 c# generics

类型参数必须有一个公共(public)的无参数构造函数。与其他约束一起使用时,必须最后指定 new() 约束。

当需要这个约束时,你们能给我一个示例场景吗?

最佳答案

这本质上就是 new() 约束归结为:

class Factory<T> where T : new()
{
    public T Create()
    {
        return new T();
        //     ^^^^^^^
        //     this requires the new() type constraint.
    }
}

现在,您不能将参数传递给构造函数。如果你仍然想初始化新对象,你可以实现这个,例如通过引入进一步的约束:

interface ILikeBananas
{
    double GreenBananaPreferenceFactor { get; set; }
}

class Factory<T> where T : ILikeBananas, new()
{
    public T Create(double greenBananaPreferenceFactor)
    {
        ILikeBananas result = new T();
        result.GreenBananaPreferenceFactor = greenBananaPreferenceFactor;

        return (T)result;
        //     ^^^^^^^^^
        //     freely converting between ILikeBananas and T is permitted
        //     only because of the interface constraint.
    }
}

请注意,另一种实例化对象的方法是通过 Activator.CreateInstance ,这为您提供了更多自由,例如将参数直接传递给构造函数。

Activator.CreateInstance 并不严格要求 new() 约束;但是,被实例化的类型仍然需要提供合适的构造函数。

关于c# - 泛型:何时使用 new() 作为类型参数的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3691734/

相关文章:

c# - 基于 .Net 的网络爬虫示例

c# - 混合动态和静态 XAML 菜单项

ios - 在 Swift 中创建数组时的一般问题

java - 斯卡拉 : class[T] extends T?

c# - 有没有更有效的方法来协调大型数据集?

c# - 错误无法评估表达式,因为代码已优化

c# - 为 Canvas 上的矩形设置 zindex 不会将其置于前面

generics - 在 Scala 参数化(泛型)类型错误中使用 Guava 的简单缓存管理器

c# - 推断类型的模板和隐式类型转换有什么问题?

java - 创建通用类型适配器类不起作用