1

さて、私は、反変性により、コンパイラが 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 
    { 
    } 
}
4

1 に答える 1

2

問題は、 が をCircle実装IComparable<Shape>しているため、コンパイラがShapeT を選択することです。ただし、Shapeは を実装していないICircleため、表示されるエラーが発生します。

しかし、それは疑問を投げかけていると思います。コンパイラが制約を確認しCircleた後、推測を修正しないのはなぜですか。ICircle答えは、制約は型推論を支援するために使用されないということです。推測が行われた後にのみ、推測を無効にすることができます。

于 2012-08-09T16:57:31.700 に答える