3

所以我在这里查看了 MSDN 示例:类型参数的约束(C# 编程指南),第一个示例显示了以下泛型类,它定义了where具有单个具体类型的约束:Employee

public class GenericList<T> where T : Employee

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

public T FindFirstOccurrence(string s)

有以下因为无论如何只有一个约束

public Employee FindFirstOccurrence(string s)

我可以看到使用单个约束部署代码的唯一原因where是为了在未来灵活地为 if become 添加额外的约束,Employee并且IEmployee我为更改设置得更容易一些。

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

谢谢!

4

4 回答 4

11

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

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

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

于 2012-11-27T16:34:43.323 回答
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,但这里它返回一个 Manager。我们避免向上转换类型,同时仍然保持静态类型。在其他情况下它也很有用,但基本原则是泛型的常见用途。

于 2012-11-27T16:49:29.440 回答
1

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

假设 T 是一个基类ShapesoSquare和extend 。当您有约束时,您实际上可以注入 or , , or并且它们中的每一个都有自己的实现。RectangleTriangleTTSquareRectangleTriangle

于 2012-11-27T16:39:24.000 回答
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));
  }
}
于 2012-11-27T16:44:42.333 回答