c# - 类型参数约束是一个类

标签 c# generics inheritance interface covariance

我注意到其他开发人员使用了这种技术,但它总是让我感到困惑。我决定今天早上进行调查,并在 MSDN 上发现了以下内容(来自 http://msdn.microsoft.com/en-us/library/d5x73970(v=vs.100).aspx ):

public class GenericList<T> where T : Employee
{
...
}

为什么我们要使用此方法而不是用类中的 Employee 替换所有 T 实例?对我来说,这似乎是可维护性的胜利。我可以将限制为接口(interface)理解为包含来自不同继承层次结构的类的一种方式,但继承已经以更明显的方式解决了上述问题,不是吗?

这可以被认为是一个错误,还是像这样“修复”代码是一个错误?

最佳答案

因为它可能是从 Employee 派生的东西。

public class EvilEmployee : Employee {
    public Int32 Evilness { get; set; }
}

现在可以做...

GenericList<EvilEmployee> list = GetEvilEmployees();
var mostEvilEmployee = list.OrderByDescending(e => e.Evilness).First();

这是可能的,因为我们在编译时知道 T = EvilEmployee 并且 EvilEmployee 具有 Evilness 属性。如果我们强制将列表放入 Employee 列表中,那将是不可能的(不使用 OfType)。

关于c# - 类型参数约束是一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10102241/

相关文章:

c# - 在 ASP.NET MVC 3 中,什么是 filterContext.IsChildAction?

c# - 如何避免在 UI 层中引用 DataLayer?

java - 对类型参数做出假设?

c# - 条件运算符会感到困惑,但为什么呢?

java - 如何将多个接口(interface)分组为一个通用的单个接口(interface)?

C# Lambda 表达式和 NHibernate

java - 用Java中的泛型方法覆盖泛型方法

c# - 在泛型方法中实例化泛型类型

java - 设计枚举通用行为

c# - 如何在 ASP.net Core 1.1 MVC 中将用户重定向到新 URL