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

本文关键字:第二个 参数 Select SelectMany Linq | 更新日期: 2023-09-27 18:08:13

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

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

这实际上不是特定LINQ扩展方法的问题,而是如何处理Func s和Action s的可选参数,简而言之,它们不是,它们被视为常规参数,在选择相应的Func/Action签名时会省略默认值。看看这里可选参数,没有过载';员工';匹配委托';System.Func<员工>或者这里调用函数<T1、T2、T3>哪个具有可选参数?。

换句话说,您的MyFunc不能用作Func<string, string>,您必须使用Func<string, int, string>,在Select的情况下,它恰好作为添加了索引的重载出现。