【问题标题】:Is it pointless to have both "class" and "new()" constraints in a generic class?在泛型类中同时具有“类”和“新()”约束是否毫无意义?
【发布时间】:2013-07-16 23:47:24
【问题描述】:

我想知道在定义泛型类时同时拥有“class”和“new()”约束是否有意义。如下例:

class MyParanoidClass<T> where T : class, new()
{
 //content
}

两个约束都指定 T 应该是一个引用类型。虽然“类”约束并不意味着存在隐式构造函数,但“new()”约束确实需要一个带有额外公共构造函数定义的“类”。

我的最后一个问题(公式化)是:像上面的语句那样定义一个泛型类有什么好处,还是“new()”封装了这两个约束?

【问题讨论】:

  • 我不认为new() 强制引用类型,只是一个公共的无参数构造函数,值类型可以有(但我认为他们都有这个值类型,所以它几乎没有意义)。
  • @AdamHouldsworth:值类型总是有一个公共的无参数构造函数。这也不是没有意义的,因为new() 约束允许类内的代码通过new T() 创建T 的新实例。如果省略约束,这是不可能的。
  • @DanielHilgarth 是的,我继续这么说,但在毫无意义的一点上足够公平。但是,这可能与default(T) 相同。
  • @AdamHouldsworth:不,当然不是。 default(T)null 的引用类型。这与new T() 非常不同,后者是一个新实例。
  • @DanielHilgarth 我指的是值类型。

标签: c# generics constraints


【解决方案1】:

new() 不暗示引用类型,因此:不,class 在使用 new() 时不是多余的。

以下代码证明:

void Main()
{
    new MyParanoidClass<S>();
}

struct S {}

class MyParanoidClass<T> where T : new()
{
    //content
}

此代码编译,证明new() 不在乎您使用引用还是值类型。

【讨论】:

  • +1 明确说明in the documentation
  • @AdamHouldsworth IMO 甚至文档都不是很清楚。 "struct" 暗示 "new()" 但/然后 "new()" 不能与 "struct" 一起使用(即使他们没有这么说)。
  • @Adriano new 可以与struct 一起使用,它们有构造函数。
  • @AdamHouldsworth: Adriano 的意思是new() 约束不能与struct 约束一起使用,因为struct 约束确实暗示了new() 约束,因为所有结构有一个公共的无参数构造函数(你不能做任何事情)。
  • @AdamHouldsworth 不,你不能将 "new()" 约束与 "struct" 结合使用(我想是因为这个时间确实是隐含的)。
【解决方案2】:

不,它们不是没用的。

第一个参数class确保类型参数必须是引用类型,包括任何类、接口、委托或数组类型,

而第二个参数 new() 确保它有一个无参数的默认构造函数。它不适用于任何没有无参数默认构造函数的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多