根据MSDN,该new()约束用于确保类型参数必须具有公共无参数构造函数。但是,请考虑下面给出的示例(取自同一页面)。
public class Employee
{
public Employee(string name, int id)
{
Name = name;
ID = id;
}
public string Name { get; set; }
public int ID { get; set; }
}
class EmployeeList<T> where T : Employee, new()
{
}
Run Code Online (Sandbox Code Playgroud)
此处,该Employee类型没有无参数/默认构造函数,但此代码编译成功。有人可以详细说明这个约束的用法以及为什么它有效吗?
该代码可以编译,因为完全有可能使用无参数构造函数派生出一个类型Employee- 这就是约束所说的。该约束并不是试图说它本身有一个无参数构造函数,并且实际上,由于不满足约束,因此Employee尝试使用会失败。EmployeeList<Employee>
作为有效的示例:
public class GeneratedEmployee : Employee
{
public GeneratedEmployee() : base(GenerateName(), GenerateId())
{
}
private static string GenerateName()
{
// Implementation here
}
private static int GenerateId()
{
// Implementation here
}
}
Run Code Online (Sandbox Code Playgroud)
此时,可以创建一个EmployeeList<GeneratedEmployee>,并且假设该类在实现中的某个EmployeeList<>位置使用new(),它将调用 的无参数构造函数GeneratedEmployee。
也就是说,这是一个非常奇怪的约束,因为我不希望您真的想要在不指定姓名和 ID 的情况下创建员工。
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |