C# 两者兼而有之是否毫无意义;“类”;及;新的();泛型类中的约束?

C# 两者兼而有之是否毫无意义;“类”;及;新的();泛型类中的约束?,c#,generics,constraints,C#,Generics,Constraints,我想知道在定义泛型类时同时使用“class”和“new()”约束是否有意义。如下例所示: class MyParanoidClass<T> where T : class, new() { //content } class-MyParanoidClass其中T:class,new() { //内容 } 这两个约束都指定T应该是引用类型。虽然“class”约束并不意味着存在隐式构造函数,“new()”约束确实需要一个带有额外公共构造函数定义的“class” 我的最后一个(对该问

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

class MyParanoidClass<T> where T : class, new()
{
 //content
}
class-MyParanoidClass其中T:class,new()
{
//内容
}
这两个约束都指定T应该是引用类型。虽然“class”约束并不意味着存在隐式构造函数,“new()”约束确实需要一个带有额外公共构造函数定义的“class”

我的最后一个(对该问题的表述)问题是:像上面的语句那样定义泛型类,或者“new()”封装了这两个约束,对我有什么好处吗?

new()
并不意味着引用类型,所以:不,
class
在使用
new()
时不是多余的

以下代码演示了:

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

struct S {}

class MyParanoidClass<T> where T : new()
{
    //content
}
void Main()
{
新的MyParanoidClass();
}
结构S{}
类MyParanoidClass,其中T:new()
{
//内容
}

这段代码进行编译,证明
new()
不在乎是否使用引用或值类型。

不,它们不是无用的

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


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

我不认为
new()
强制引用类型,只是一个公共的无参数构造函数,值类型可以有(但我认为它们都有这个值类型,所以它几乎没有意义).@adamhuldsworth:值类型始终具有公共无参数构造函数。这并不是毫无意义的,因为
new()
约束允许类内的代码通过
new T()
创建
T
的新实例。如果省略了约束,这是不可能的。@DanielHilgarth是的,我继续这么说,但在毫无意义的一点上是足够公平的。但是,这可能与
default(T)
@AdamHouldsworth相同:不,当然不是<对于引用类型,代码>默认值(T)为
null
。这与
new T()
非常不同,后者是一个新实例。@DanielHilgarth我指的是值类型。+1说明得很清楚。@Adamhuldsworth我甚至连文档都不清楚。“struct”意味着“new()”,但/然后“new()”不能与“struct”一起使用(即使他们没有这样说)。@Adriano
new
可以与
struct
一起使用,他们有构造函数。@Adamhoudsworth:Adriano的意思是
new()
约束不能与
struct
约束一起使用,因为
struct
约束确实意味着
new()
约束,因为所有的结构都有一个公共的无参数构造函数(你对此无能为力)。@AdamHouldsworth不,你不能将“new()”约束与“struct”结合使用(我认为这一次是隐含的)。