泛型具有继承的新关键字

时间:2013-05-08 15:01:37

标签: c# generics inheritance

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

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

3 个答案:

答案 0 :(得分:1)

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抽象或制作确保它没有公共的无参数构造函数(子类必须提供一个才能与此方法一起使用)。

进一步阅读

答案 1 :(得分:0)

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

答案 2 :(得分:0)

声明中:

where T : Person, new()

Person指定T必须是可以转换为Person

类型的类型

new()指定T有默认构造函数,因此您的方法可以执行new T()

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

PS。如果对某些与语法相关的问题有疑问,请不要犹豫,写一个快速测试;它只会有助于更好地理解语言。在个人情况下,我喜欢用LINQPad来编写快速测试。