泛型new关键字具有继承性
本文关键字:继承性 关键字 new 泛型 | 更新日期: 2023-09-27 18:12:34
我只需要允许从Person类继承的类型与此方法一起使用。这是一个有效的方法吗?
public static void Add<T>(T item) where T : Person, new()
{}
Person
约束满足只有类型为Person
(或其子类之一)的对象可以与此方法一起使用的条件。构造函数约束(new
)确保提供的类型有一个公共的、无参数的构造函数。只有在方法调用类的构造函数时才需要这样做。
public static void Add<T>(T item) where T : Person, new()
{
var newItem = new T();
...
}
这里需要new
约束,因为行new T()
。如果该方法不包含对构造函数的调用,则不需要包含new
约束。
如果你想确保只有类型是Person
的子类的对象可以用这个方法使用,而不是Person
类型的对象,你可以使Person
抽象,或者确保它没有一个公共的,无参数的构造函数(子类必须提供一个,以便与这个方法一起使用)。
进一步阅读
- 类型参数的约束(c#编程指南)
当然可以。您已经定义了一个静态方法,允许任何从Person继承并具有默认构造函数的类作为参数传递。
语句中:
where T : Person, new()
Person
指定T
必须是可以转换为Person
类型的类型
new()
指定T
有一个默认构造函数,因此你的方法将能够执行new T()
所以如果你想让T
成为Person
,约束的第一部分就足够了。如果您希望能够创建新实例,那么您还需要第二部分。
p。当对一些语法相关的问题有疑问时,不要犹豫,编写一个快速测试;它只会帮助你更好地理解语言。就我个人而言,我喜欢使用LINQPad编写快速测试。