C# 带有继承的泛型新关键字

C# 带有继承的泛型新关键字,c#,generics,inheritance,C#,Generics,Inheritance,我只需要允许从Person类继承的类型与此方法一起使用。这是一种有效的方法吗 public static void Add<T>(T item) where T : Person, new() {} publicstaticvoidadd(T项),其中T:Person,new() {} 是的,绝对是。您已经定义了一个静态方法,该方法允许从Person继承的任何类以及作为参数传递默认构造函数的任何类。在语句中: where T : Person, new() Person指定T必须

我只需要允许从Person类继承的类型与此方法一起使用。这是一种有效的方法吗

public static void Add<T>(T item) where T : Person, new()
{}
publicstaticvoidadd(T项),其中T:Person,new()
{}

是的,绝对是。您已经定义了一个静态方法,该方法允许从Person继承的任何类以及作为参数传递默认构造函数的任何类。

在语句中:

where T : Person, new()
Person
指定
T
必须是可以转换为type
Person

new()
指定
T
具有默认构造函数,因此您的方法将能够执行
new T()

因此,如果您只想让
T
成为
,那么约束的第一部分就足够了。如果希望能够创建新实例,那么还需要第二部分


当对一些语法相关的问题有疑问时,不要犹豫,写一个快速测试;这只会有助于更好地理解语言。就个人而言,我喜欢用它来编写快速测试。

Person约束满足以下条件:只有Person类型的对象(或其子类之一)可以与此方法一起使用。构造函数约束(
new
)确保提供的类型具有公共的、无参数的构造函数。只有当您的方法调用类上的构造函数时,才需要它

例如:

public static void Add<T>(T item) where T : Person, new()
{
    var newItem = new T();
    ...
}
publicstaticvoidadd(T项),其中T:Person,new()
{
var newItem=newt();
...
}
这里需要
new
约束,因为行
new T()
。如果该方法不包含对类似构造函数的调用,则不需要包含
new
约束

如果要确保此方法只能使用类型为
Person
子类的对象,而不能使用类型为
Person
的对象,可以将
Person
抽象化,或者确保它没有公共的无参数构造函数(子类必须提供一个才能与此方法一起使用)

进一步阅读


为什么不尝试传递各种类型,有些是人,有些不是人,看看会发生什么?你是说不允许
Person
类型的实例,但允许所有派生类型?这在编译时是不可能的。
new()
不会给你的。@Sebastian,除非
Person
没有默认构造函数;那么它就会有了。@Servy:很好的观点!尽管我怀疑这是OP的意图;-)我需要它是强类型的,并且只允许从Person类继承的没有参数的构造函数的类型。