所以我在这里查看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}}约束提供什么目的吗?
谢谢!
答案 0 :(得分:10)
为什么我只想使用where约束限制为单个具体类型?
不完全正确 - 约束在Employee
类型以及从中继承的任何类型,因此它也可以应用于Manager
和CEO
类。
定义约束意味着您可以在代码中的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
,因此Square
,Rectangle
和Triangle
扩展T
。当您使用T
约束时,您可以实际注入或Square
,Rectangle
或Triangle
,并且每个都有自己的实现。
答案 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));
}
}