2016-09-22 5 views
1

は私だけのLINQでの奇妙な行動を発見した:LINQの.Selectは、()/ .SelectMany()は自動的に2番目の使用、オプションのパラメータ

私は関数名を渡したい単項関数を呼び出して、その代わりに

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

私は同じでなければなりません

var foo = myList.Select(MyFunc); 

を書きます。場合によっては、そうではありません!この場合、

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

、2番目のパラメータはどちらかではない場合

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

に等しい

var foo = myList.Select(MyFunc); 

の文:関数は、intとオプションのある二番目のパラメータを持っている。すなわち場合コンパイラは文句を言っていませんが、intと言っても、コンパイラは不平を言っていますが、この場合はあなたを驚かせるだけです。

他に誰かがこれに遭遇しましたか?他にどのようなLinq式がこのように機能しますか? (これまでは.SelectMany())。

答えて

2

これは具体的なLINQ拡張メソッドの問題ではありませんが、オプションのパラメーターはFuncと、それ以外の方法でどのように処理されるのですか?そして、この動作を回避する最もエレガントな方法は何ですか?つまり、対応するFunc/Actionシグネチャを選択すると、通常のパラメータとみなされ、デフォルト値は省略されます。ここで見てくださいOptional Parameters, No overload for 'Employee' matches delegate 'System.Func<Employee>またはここにInvoke Func<T1, T2, T3> which has optional parameters?。言い換えれば

、あなたのMyFuncFunc<string, string>として使用することはできません、あなたはSelectの場合には、インデックスを追加して、過負荷として存在であることを起こるFunc<string, int, string>を、使用する必要があります。

関連する問題