- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
早些时候,我在通用 IComparable<T>
中获得了逆变的具体示例Jon Skeet 的界面。然而,这又产生了另一个问题。为什么不是通用的 List<T>.Sort()
方法能够推断出相同的信息?
我在这里提供了引用示例作为 static Foo<T>()
方法。您会发现此方法能够推断出 T
的类型并调用CompareTo(Circle)
. List<ICircle>.Sort()
另一方面无法推断 T
的类型所以调用CompareTo(Object)
.
using System;
using System.Collections.Generic;
namespace Testable
{
public class Test
{
public static void Main()
{
List<ICircle> circles = new List<ICircle>();
circles.Add(new Circle());
circles.Add(new Circle());
circles.Sort();
Foo(new Circle(), new Circle());
}
public static void Foo<T>(IComparable<T> a, T b) where T : ICircle
{
a.CompareTo(b);
}
}
public interface ICircle
{
}
public class Circle :
IComparable, IComparable<Circle>, ICircle
{
public Int32 CompareTo(Object other)
{
Console.WriteLine("Called CompareTo(Object)");
return 0;
}
public Int32 CompareTo(Circle other)
{
Console.WriteLine("Called CompareTo(Circle)");
return 0;
}
}
}
最佳答案
列表是ICircle
的列表, 不是 Circle
的列表. ICircle
没有实现 IComparable<Circle>
或 IComparable<ICircle>
(或任何其他 IComparable
接口(interface)。您放入列表中的所有项目都恰好实现了 IComparer<Circle>
并且是 Circle
s,但是您可以轻松地将一个项目放入已实现的 ICircle
并实现根本没有 IComparable
接口(interface)。
Foo
另一方面需要 IComparable<T>
作为参数,所以你知道它实现了IComparable<T>
.
关于c# - 为什么 List<IShape>.Sort() 调用 CompareTo(Object) 而不是 CompareTo(Shape)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11886976/
我有一个对象集合: IEnumerable 这些对象支持接口(interface) IShape 但我在尝试将其传递到要求的函数时遇到错误: IEnumerable 为什么我不能传递这个? 是否有
早些时候,我在通用 IComparable 中获得了逆变的具体示例Jon Skeet 的界面。然而,这又产生了另一个问题。为什么不是通用的 List.Sort()方法能够推断出相同的信息? 我在这里提
我是一名优秀的程序员,十分优秀!