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