2008-11-06 17 views
5

這樣奇怪的情況,我今天碰見與排序依據:C#3.0功能/排序依據的類型推斷

Func<SomeClass, int> orderByNumber = 
    currentClass => 
    currentClass.SomeNumber; 

然後:

someCollection.OrderBy(orderByNumber); 

這是好的,但我要創建一個方法,而不是因爲它可能在orderBy以外的其他地方可用。

private int ReturnNumber(SomeClass currentClass) 
{ 
    return currentClass.SomeNumber; 
} 

現在,當我試圖把它插入到該排序依據:

someCollection.OrderBy(ReturnNumber); 

它不能推斷喜歡的話可以的類型,如果我使用Func鍵。對我來說,他們應該是相同的,因爲方法本身就像Func那樣是「強類型」的。

邊注:我知道我能做到這一點:

Func<SomeClass, int> orderByNumber = ReturnNumber; 

回答

8

這也涉及到"return-type type inference" not working on Method Groups

本質上,在箱子(如Where的謂詞),其中通用參數僅在輸入位置處,方法組轉換工作正常。但在一般的參數是一個返回類型(如SelectOrderBy突起)的情況下,編譯器將不能推斷適當的委託轉換。

8

ReturnNumber的方法 - 相反,它表示含有所有方法用名稱ReturnNumber但具有潛在不同的元數和式簽名的方法組。有一些技術問題需要通過一種非常通用並且每次都是工作的方式來確定您實際需要的方法組中的哪種方法。顯然,編譯器可以弄清楚一些,甚至絕大多數的時間,但作出決定的是把一個算法到編譯器這將工作只有一半時間是一個壞主意。

下工作,但是:

someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber)) 
+0

方法組是我並沒有考慮過。希望我能標出兩個答案。 – 2008-11-06 19:16:29