我只需要允许从 Person 类继承的类型与此方法一起使用。这是一种有效的方法吗?
public static void Add<T>(T item) where T : Person, new()
{}
我只需要允许从 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();
...
}
由于 line ,此处new
需要约束new T()
。如果该方法不包含对这样的构造函数的调用,则不需要包含new
约束。
如果您想确保只有类型是子类的对象Person
才能与此方法一起使用,而不是 type 的对象Person
,您可以制作Person
abstract 或确保它没有公共的、无参数的构造函数(子类必须提供一个以便与此方法一起使用)。
延伸阅读
是的,一点没错。您已经定义了一个静态方法,该方法允许从 Person 继承并具有默认构造函数的任何类作为参数传递。
在声明中:
where T : Person, new()
Person
指定T
必须是可以转换为类型的类型Person
new()
指定T
具有默认构造函数,因此您的方法将能够执行new T()
因此,如果您只想T
成为 a Person
,那么约束的第一部分就足够了。如果您希望能够创建新实例,那么您还需要第二部分。
PS。当对一些与语法相关的问题有疑问时,不要犹豫,写一个快速测试;它只会有助于更好地理解语言。就个人而言,我喜欢使用LINQPad来编写快速测试。