2016-09-22 87 views
1

我剛發現在LINQ的怪異的行爲:LINQ的。選擇()/ .SelectMany()自動使用第二,可選參數

當調用一元函數我喜歡只通過函數名,所以不是

var foo = myList.Select(item => MyFunc(item)); 

我寫

var foo = myList.Select(MyFunc); 

這應該是相同的。只有在某些情況下,它不是!即如果該函數具有第二參數,其是一個int和可選的:

private string MyFunc(string input, int foo = 0) 
{ 
    ... 
} 

在這種情況下,聲明

var foo = myList.Select(MyFunc); 

等於

var foo = myList.Select((item, index) => MyFunc(item, index)); 

如果第二參數是不opional或不是int,編譯器抱怨,但在這種情況下,它只是偷偷摸摸地讓你感到驚訝。

有沒有其他人遇到過這個?哪種其他Linq表達式以這種方式工作? (到目前爲止,.SelectMany()呢)。什麼是最好的方法來解決此行爲(並防止其他陷入同一陷阱?)

回答

2

這不是一個真正的具體LINQ擴展方法的問題,但如何處理可選參數Func s和Action s,簡而言之 - 它們不是,它們被認爲是一個常規參數,在選擇相應的Func/Action簽名時省略默認值。看看這裏Optional Parameters, No overload for 'Employee' matches delegate 'System.Func<Employee>或這裏Invoke Func<T1, T2, T3> which has optional parameters?

換句話說,你的MyFunc不能用作Func<string, string>,則必須使用Func<string, int, string>,這在Select情況下,恰好是存在過載與指數增加。