2012-08-09 18 views
1

好吧,我已經指示,由於逆變編譯器應該能夠推斷T =圈,因此允許編譯。但是,對於編譯器版本4.0.30319.1,我收到以下錯誤:如果逆變允許編譯器推斷T =圓?

錯誤CS0311:類型'Testable.Shape'不能用作泛型類型或方法'Testable.Test.Foo中的類型參數'T' System.IComparable,T)'。沒有從「Testable.Shape」到「Testable.Circle」的隱式引用轉換。

的代碼,但是,如果我在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 
    { 
    } 
} 

回答

2

的問題是,Circle實現IComparable<Shape>,所以編譯器選擇Shape爲T.然而,Shape沒有實現ICircle,所以你得到你所看到的錯誤。

我想這引出了一個問題,雖然。爲什麼不編譯器修改其猜測到Circle一旦它看到ICircle約束。答案是constraints are not used to aid in type inference。它提出後,他們只能無效猜測。

+0

+1。當我輸入相同的答案時,你擊敗了我。乾杯:P – Channs 2012-08-09 16:58:34

+0

感謝您的參考,我「會,一定要閱讀以後今晚(考試和所有) – blf 2012-08-09 17:03:26

+1

假設雖然這'Circle'是在另一個空間中定義的編譯器將不能夠‘修改它的猜測’。 。在foo的調用點考慮到新的類可以在其他命名空間後添加的「最好的猜測」可能不可用在編譯的時候就可以只給編譯器的提示通過指定類型參數:'富 (新Circle(),新Circle())' – 2012-08-09 17:04:04

相關問題