簡體   English   中英

通過Func <TSource, TKey> keySelector錯誤

[英]passing Func<TSource, TKey> keySelector error

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(); 但我希望通過定義不同的功能來做到這一點。 我做錯了什么?

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

您需要顯式傳遞類型參數,如下所示:

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

要么,

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

SLaks是正確的,因為C#3編譯器不允許這樣做,但重要的是要指出C#4編譯器將編譯您的示例而沒有問題。

這是發生了什么。 當我第一次實現C#3的方法類型推理算法時,我推斷SLaks建議:方法組沒有類型,在C#2中沒有任何推斷,並且重載解析需要通過知道類型從方法組中選擇方法這些論點正是我們試圖推斷的; 這是雞和蛋的問題。 我在2007年11月的博客中寫道:

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

對此有如此多的推遲,我們決定重新審視該問題並更改類型推斷算法,以便我們從方法組進行推斷,只要已經做了足夠的推論,就可以在方法組上進行重載解析。

不幸的是,這個變化在周期中來得太晚了,並沒有進入C#3。我們將它推遲到C#4,然后你就去了。

我在2008年的博客中寫道:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM