在.NET中,IEnumerable<T>扩展了IEnumerable这一事实常常派上用场。令人沮丧的是,尽管EqualityComparer<T>和Comparer<T>类都实现了这两个接口,但IEqualityComparer<T>和IComparer<T>并没有扩展它们的非泛型对应物。这种差异是有原因的吗?
发布于 2013-03-23 02:41:16
如果我有一个字符串序列,我可以用它来获得一个对象序列,因为每个字符串也是一个对象。这适用于任何序列;当给定任何序列时,我总是可以获得对象的序列。
如果我有一个可以比较两个字符串的对象,我就不能用它来比较两个对象,因为这两个对象可能不是字符串。
这是因为IEnumerable<T>是协变的,而IComparer和IEqualityComparer不是协变的。(不仅仅是在C#的意义上,尽管这也是正确的,但也是在概念计算机科学的意义上。)
至于为什么具体的EqualityComparer<T>和Comparer类实现两个接口,而不仅仅是泛型版本,这是一个只有选择创建这些类型的员工才能真正解释的决定。我可以想象,他们这么做是因为当时有足够多的人在使用接口的非泛型版本,他们希望这些类型可以与所有现有的非泛型代码一起使用。
https://stackoverflow.com/questions/15577585
复制相似问题