C# 两者兼而有之是否毫无意义;“类”;及;新的();泛型类中的约束?
我想知道在定义泛型类时同时使用“class”和“new()”约束是否有意义。如下例所示: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 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”一起使用(即使他们没有这样说)。@Adrianonew
可以与struct
一起使用,他们有构造函数。@Adamhoudsworth:Adriano的意思是new()
约束不能与struct
约束一起使用,因为struct
约束确实意味着new()
约束,因为所有的结构都有一个公共的无参数构造函数(你对此无能为力)。@AdamHouldsworth不,你不能将“new()”约束与“struct”结合使用(我认为这一次是隐含的)。