泛型new关键字具有继承性

本文关键字:继承性 关键字 new 泛型 | 更新日期: 2023-09-27 18:12:34

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

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

泛型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编写快速测试。