类型参数的约束 - new()

Fah*_*had 3 c# generics

根据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类型没有无参数/默认构造函数,但此代码编译成功。有人可以详细说明这个约束的用法以及为什么它有效吗?

Jon*_*eet 6

该代码可以编译,因为完全有可能使用无参数构造函数派生出一个类型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 的情况下创建员工。