2010-05-11 54 views
3
static void Main() 
     { 
string[] a = { "a", "asd", "bdfsd", "we" }; 
      a = a.OrderBy(fun).ToArray(); 
} 

private static int fun(string s) 
     { 
      return s.Length; 
     } 

它給編譯時錯誤。我知道我們可以像這樣用Lambda表達式來做到這一點。 a.OrderBy(s=>s.Length).ToArray();但我想通過定義不同的功能來做到這一點。我做了什麼錯誤?傳遞Func <TSource,TKey> keySelector錯誤

+0

代碼你寫的似乎編譯和執行好,你有沒有收到什麼樣的錯誤? – 2010-05-11 15:37:40

+0

無法推斷'Enumerable.OrderBy'的類型參數。 – SLaks 2010-05-11 15:40:23

+0

它也爲我編譯。 – 2010-05-11 15:45:25

回答

6

表達式fun是稱爲方法組的無類型表達式。
由於方法組沒有類型,因此編譯器無法推斷通用OrderBy方法的類型參數。

你需要明確傳遞類型參數,就像這樣:

a = a.OrderBy<string, int>(fun).ToArray(); 

或者,

a = a.OrderBy(new Func<string, int>(fun)).ToArray(); 
+0

我的印象是,你實際上可能......不會'推測'爲Func ?我很困惑,因爲我複製了他的代碼,並且在沒有觸及它的情況下在.NET 3.5上編譯和執行。 – 2010-05-11 15:47:50

+0

@Dynami:如果你傳遞一個方法組(而不是一個委託變量)它只會失敗我試過了;它確實失敗(方法'System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable ,System.Func )'的類型參數不能根據用法推斷。明確指定類型參數。) – SLaks 2010-05-11 15:49:31

+2

嗯,我用我的好東西'VS2008重試它,你似乎是正確的。所以我猜在VS2010下有一個。NET 3.5項目我實際上正在編譯C#4編譯器,不知道。 – 2010-05-11 16:03:01

3

這是發生了什麼事。當我第一次實現C#3的方法類型推斷算法時,我推斷出SLaks建議:方法組沒有類型,在C#2中沒有推斷出任何類型,重載解析需要通過知道類型來從方法組中提取方法的論點,這正是我們試圖推斷的;這是一個雞和雞蛋的問題。我的博客上講述的是在2007年11月的:

http://blogs.msdn.com/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-does-not-work-on-member-groups.aspx

有這個這麼多的反推,我們決定重新審視這一問題,改變類型推理算法,使我們從法團作出的推斷提供了足夠的推論有已經完成重載解析可以在方法組上進行。

不幸的是,變化來得太晚了,並沒有成爲C#3。我們推遲到C#4,並且你去了。

我在2008年的博客上講述的是:

http://blogs.msdn.com/ericlippert/archive/2008/05/28/method-type-inference-changes-part-zero.aspx

相關問題