首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么IComparable<T>不继承IComparable?

为什么IComparable<T>不继承IComparable?
EN

Stack Overflow用户
提问于 2019-09-23 22:59:49
回答 2查看 147关注 0票数 4

在大多数地方,我读到在类中同时继承IComparableIComparable<T>是一个好主意,以提供与非泛型集合的兼容性。我的问题是,为什么IComparable<T>在默认情况下不继承IComparable?通过这种方式可以实现向后兼容。

例如,IEnumerable<T>确实继承了IEnumerable,那么为什么不对IComparable做同样的事情呢?我读过关于差异的文章,但我仍然不能真正理解为什么它是这样设计的。我尝试创建一个具有相同架构的接口的小示例,它按预期工作。

编辑:另外,Microsoft文档声明:如果泛型接口是逆变量,则泛型接口可以从非泛型接口继承,这意味着它只使用其类型参数作为返回值。在.NET框架类库中,IEnumerable<T>继承自IEnumerable,因为IEnumerable<T>仅在GetEnumerator的返回值和Current属性获取方法中使用T。

尽管如此,人们可以很好地从IComparable<T>继承IComparable (如果您使用相同的体系结构创建接口)。

EN

回答 2

Stack Overflow用户

发布于 2019-09-23 23:09:04

如果未指定type,则实现泛型接口的类也需要实现默认类型方法

代码语言:javascript
复制
    public interface IFoo
    {
        void Foo(object o);
    }

    public interface IFoo<T> : IFoo
    {
        void Foo(T o);
    }

这就变成了

代码语言:javascript
复制
public class Foo : IFoo<int>
    {
        void IFoo<int>.Foo(int o)
        {
            throw new System.NotImplementedException();
        }

        void IFoo.Foo(object o)
        {
            throw new System.NotImplementedException();
        }
    }

在本例中,您使用一个方法实现了一个接口,而且似乎必须实现两个方法,在这两个方法中继承自类型化接口

票数 0
EN

Stack Overflow用户

发布于 2019-09-23 23:19:14

这归根结底是一个语言设计决策,所以我们只能猜测一下开发人员的话。

一个很好的理由肯定是一个是通用的,另一个不是。泛型本质上优于非泛型解决方案(这意味着使用对象作为类型),因为它们在编译时维护类型安全。因此,可能是有意选择与前通用版本决裂。以避免向下兼容。请注意,大多数实现泛型版本的类都没有实现它的非泛型副本。真正的基础和旧东西,如字符串是例外-因为他们不能删除旧的接口,只能添加新的接口。

有了枚举器,这种需求就不那么极端了。枚举数通常是从集合中生成的,而不是从集合中生成的,并且是纯读取处理。因此,您要么也有固定类型要强制转换,要么有固定类型要在枚举器中使用。

另一个可能的原因是,使用IComparable的代码要么显式地要求它(类型约束),要么由由它构成的东西组成-并且根据定义本身是泛型的。它最常用于泛型集合中的排序函数。有可能他们不想再使用旧的收藏了。在字典中不支持IComparable当然是让HashTable (它的前类属对应项)退出流通的一个好选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58065180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档