我只需要允许从Person类继承的类型与此方法一起使用。这是一种有效的方法吗?
public static void Add<T>(T item) where T : Person, new()
{}
答案 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来编写快速测试。