c# - 为什么 IComparable<T> 不继承自 IComparable?

标签 c# interface comparable contravariance icomparable

在大多数地方,我读到从 IComparable 继承是个好主意。和 IComparable<T>在你的类中提供与非通用集合的兼容性。我的问题是为什么IComparable<T>不继承自 IComparable那么默认呢?向后兼容性将通过这种方式实现。

例如,IEnumerable<T>确实继承自 IEnumerable ,那么为什么不对 IComparable 做同样的事情呢? ?我读到了差异,但我仍然不明白为什么要这样设计。我尝试创建一个具有相同架构接口(interface)的小示例,它按预期工作。

编辑: 此外,Microsoft 文档说明如下: 如果泛型接口(interface)是逆变的,则泛型接口(interface)可以从非泛型接口(interface)继承,这意味着它只使用其类型参数作为返回值。在 .NET Framework 类库中,IEnumerable<T>继承自 IEnumerable因为IEnumerable<T>仅在 GetEnumerator 的返回值中使用 T在Current属性 getter 。

但尽管如此,还是可以继承 IComparable来自 IComparable<T>很好(如果您创建具有相同架构的接口(interface),那就是)。

最佳答案

自己试一下,如果没有指定类型那么实现泛型接口(interface)的类也需要实现默认的类型方法

    public interface IFoo
    {
        void Foo(object o);
    }

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

变成

public class Foo : IFoo<int>
    {
        void IFoo<int>.Foo(int o)
        {
            throw new System.NotImplementedException();
        }

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

在这种情况下,您使用一种方法实现了一个接口(interface),看起来您必须实现两种继承自类型化接口(interface)的方法

关于c# - 为什么 IComparable<T> 不继承自 IComparable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58065180/

相关文章:

c# - 打开 XML(Microsoft Word): C# Table Justification

c# - SQL Scope_Identity 返回 0 或 -1

c# - Shellsort,2.48^(k-1) vs Tokuda 的序列

Java:创建和不创建对象的接口(interface)实例化

c# - 在类中添加不在接口(interface)定义中的公共(public)方法是一个好习惯吗?我什么时候应该这样做?

Java:我根本不理解这个泛型定义

java - 从 array.sort() 到compareTo()

c# - 为什么我的 listboxitems 不折叠?

Java 泛型 API 架构

java - 为什么 Collections.sort 使用相同的参数调用 Comparator 两次?