3

IComparable<T>以前、 Jon Skeetからジェネリック インターフェイスの反変性の具体例を提供されました。しかし、これはさらに別の疑問を引き起こしました。List<T>.Sort()ジェネリックメソッドが同じ情報を推測できないのはなぜですか?

ここで参照されている例をstatic Foo<T>()メソッドとして提供しました。このメソッドが と の型を推測できることがわかりTますCompareTo(Circle)List<ICircle>.Sort()一方、Tand so 呼び出しの型を推測することはできません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;
        }
    }
}
4

1 に答える 1

5

リストは のリストであり、 のリストではICircleありませんCircle。 or (または他のインターフェイスをICircle実装しません。リストに入れるすべてのアイテムはたまたま実装してs になりますが、インターフェイスをまったく実装せずに実装したアイテムを簡単に配置することもできます。IComparable<Circle>IComparable<ICircle>IComparableIComparer<Circle>CircleICircleIComparable

Foo一方IComparable<T>、 をパラメーターとして受け取るので、 を実装していることがわかりIComparable<T>ます。

于 2012-08-09T15:46:52.387 に答える