类型参数约束是一个类

Spr*_*gue 3 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
{
...
}
Run Code Online (Sandbox Code Playgroud)

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

这可能被视为一个错误,或者"修复"这样的代码是错误的吗?

sis*_*sve 7

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

public class EvilEmployee : Employee {
    public Int32 Evilness { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在可以......

GenericList<EvilEmployee> list = GetEvilEmployees();
var mostEvilEmployee = list.OrderByDescending(e => e.Evilness).First();
Run Code Online (Sandbox Code Playgroud)

因为在编译时我们知道T = EvilEmployee并且EvilEmployee具有Evilness属性,所以这是可能的.如果我们要将列表强制转换为不可能的Employee列表(不使用OfType).


Hen*_*man 5

为什么我们要使用此方法而不是在类中用Employee替换T的所有实例?

启用:

class Manager : Employee { ... }

var board = new GenericList<Manager> ();
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,您的名称"GenericList"更像是"EmployeeList"

我可以理解限制接口作为包含来自不同继承层次结构的类的方法

类继承和接口有很多共同之处.

但是继承已经以更明显的方式解决了上面的问题,不是吗?

是的,但它不一样.board.Add(lowlyProgrammer);这将失败,而继承将允许它.