Linq .Select()/ .SelectMany()自动使用第二个可选参数

时间:2016-09-22 12:13:06

标签: c# linq select optional-parameters

我刚刚在Linq找到了最奇怪的行为:

调用一元函数时,我只想传递函数名,而不是

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()确实如此)。什么是解决这种行为的最优雅的方法(并防止其他人陷入同样的​​陷阱?)

1 个答案:

答案 0 :(得分:2)

这不是特定LINQ扩展方法的问题,而是如何处理FuncAction的可选参数,简而言之 - 它们不是,它们被认为是常规参数和选择相应的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恰好作为带索引的重载出现加入。