为什么IEquatable T在T#4.0中没有逆变?

Kha*_*han 17 c# c#-4.0

IEquatable <T>可能已被声明为T中的逆变,因为它只在输入位置使用T(或者,等效地,U是T的子类型应该暗示IEquatable <T>是[IE]的一个子类型<U >).

那么,为什么BCL团队没有使用'in'关键字对它进行注释(针对C#4.0),就像他们使用许多其他通用接口(如完全类似的IComparable)一样?

Meh*_*ari 13

我认为这主要是出于哲学原因而非技术限制 - 因为简单地注释界面是完全可能的.IEquatable<T>用于比较相同类型的对象以获得完全相等.通常认为超类的实例等于子类的实例.在这个意义上的平等也意味着类型平等.这有点不同IComparable<in T>.在不同类型中定义相对排序顺序是明智的.

引用MSDN页面IEquatable<T>:

对实施者的说明:

IEquatable<T>接口的type参数替换为实现此接口的类型.

这句话进一步说明了IEquatable<T>在单一具体类型的实例之间工作的事实.