为什么我会使用限制为仅限一种类型的where约束?

时间:2012-11-27 16:33:24

标签: c#

所以我在这里查看MSDN示例:Constraints on Type Parameters (C# Programming Guide),第一个示例显示了以下用一个具体类型定义where约束的泛型类:Employee

public class GenericList<T> where T : Employee

现在使用where约束时,我完全理解定义&gt;时的用法使用接口时,肯定会输入1种类型,。但是(我知道这只是一个例子),为什么我只想使用where约束来限制单个具体类型?我不能只替换下面的代码:

public T FindFirstOccurrence(string s)

以下是因为只有单一约束

public Employee FindFirstOccurrence(string s)

我可以看到使用单个where constriant部署代码的唯一原因是,为了Employee IEmployee成为where而添加额外约束,我将会灵活设置一下更容易更改。

有人可以解释使用单一类型的{{1}}约束提供什么目的吗?

谢谢!

4 个答案:

答案 0 :(得分:10)

  

为什么我只想使用where约束限制为单个具体类型?

不完全正确 - 约束在Employee类型以及从中继承的任何类型,因此它也可以应用于ManagerCEO类。

定义约束意味着您可以在代码中的Employee类型上使用任何可访问的方法,无论类型中的传递是Employee还是继承类型。

答案 1 :(得分:3)

这是您使用流畅界面看到的常见模式。请考虑以下示例代码:

public class Employee {}
public class Manager : Employee{}

public static T Method<T>(T employee) where T : Employee
{
    //do some stuff with the employee
    return employee;
}

现在,在调用方法时,我们可以这样做:

Employee employee = new Employee();
employee = Method(employee);

Manager manager = new Manager();
manager = Method(manager);

如果我们刚刚返回Employee而不是T,则第二次方法调用将返回Employee,但此处返回 {{1} }。我们避免在保持静态类型的同时向上转换类型。在其他情况下它也很有用,但这个基本原则是泛型的常见用法。

答案 2 :(得分:1)

类型T是通用类型,正如您所说,它可能是接口或基类。这意味着,除了灵活性和其他类似的东西,你可以插入实现/扩展接口/基类的其他类。因此,类型T实际上可能意味着多个类。

假设T是基类Shape,因此SquareRectangleTriangle扩展T。当您使用T约束时,您可以实际注入或SquareRectangleTriangle,并且每个都有自己的实现。

答案 3 :(得分:1)

目的是让编译器知道在通用实现中可以使用哪些方法/属性签名。

考虑一下:

public class Employee{
     public string Name{get;set;}
     public double Salary{get;set;}
}

public class Manager : Employee{
    public List<Employee> Manages{get;set;}
}

public class PayrollList<T> : List<T> where T:Employee{
    public void SendOutPeriodPay(){
    // Note that employee.Name and .Salary are accessible 
    // even if the list is of Manager type
        this.ForEach(employee=>PaySystem.SendPay(employee.Name,employee.Salary));
  }
}