さて、私は、反変性により、コンパイラが T=Circle を推論できるようにして、コンパイルを許可するように指示されました。ただし、コンパイラ バージョン 4.0.30319.1 では、次のエラーが発生します。
エラー CS0311: 型 'Testable.Shape' は、ジェネリック型またはメソッド 'Testable.Test.Foo(System.IComparable, T)' の型パラメーター 'T' として使用できません。「Testable.Shape」から「Testable.ICircle」への暗黙的な参照変換はありません。
ただし、Circle クラスに IComparable を実装すると、コードは正常にコンパイルされます。ここで何が問題になる可能性がありますか?
using System;
namespace Testable
{
public class Test
{
public static void Main()
{
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 Shape : IComparable<Shape>
{
public Int32 CompareTo(Shape other)
{
Console.WriteLine("Called CompareTo(Shape)");
return 0;
}
}
public class Circle : Shape, ICircle
{
}
}