4

我有下面的代碼:泛型類型推斷解釋

namespace ConsoleApplication1 
{ 
    using System.Collections.Generic; 
    using System.Linq; 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var bar = new object(); 

      var result = new int[] { 1, 2, 3 } 
       .Select/* <int,int> */(bar.Test<int>) 
       .ToList(); 
     } 
    } 

    public static class Extensions 
    { 
     public static TReturnType Test<TReturnType>(this object o, int e) 
     { 
      return default(TReturnType); 
     } 
    } 
} 

僅有的Visual Studio 2012米的作品就像一個魅力的機器上編譯此。但是,要在2010年僅在一臺機器上編譯它,則需要刪除<int, int>附近的註釋。

有人可以詳細說明爲什麼這現在在2012年工作,並在規範中這解釋了什麼?

+1

他們可能改善編譯器的類型推理能力,但它不會出現在列表中的改變:HTTP:/ /stackoverflow.com/a/11549260/870604 – ken2k

回答

2

問題來自於VS2010中擴展方法的類型推斷。

如果你通過一個靜態方法代替擴展方法,類型推斷將是確定:

namespace ConsoleApplication1 
{ 
    using System.Collections.Generic; 
    using System.Linq; 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var result = new int[] { 1, 2, 3 } 
       .Select/* <int,int> */(Extensions.Test<int>) 
       .ToList(); 
     } 
    } 

    public static class Extensions 
    { 
     public static TReturnType Test<TReturnType>(int e) 
     { 
      return default(TReturnType); 
     } 
    } 
} 

沒有來自微軟沒有明確回答關於C#語言規範5.0版這個問題(參見7.5.2節)。

欲瞭解更多信息,你可以在這個類似的問題,閱讀的答案:why-doesnt-this-code-compile-in-vs2010-with-net-4-0