-1

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

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

3 回答 3

1

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

例如:

public static void Add<T>(T item) where T : Person, new()
{
    var newItem = new T();
    ...
}

由于 line ,此处new需要约束new T()。如果该方法不包含对这样的构造函数的调用,则不需要包含new约束。

如果您想确保只有类型是子类的对象Person才能与此方法一起使用,而不是 type 的对象Person,您可以制作Personabstract 或确保它没有公共的、无参数的构造函数(子类必须提供一个以便与此方法一起使用)。

延伸阅读

于 2013-05-08T15:06:28.963 回答
0

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

于 2013-05-08T15:04:22.177 回答
0

在声明中:

where T : Person, new()

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

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

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

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

于 2013-05-08T15:05:21.427 回答