gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:20:42 24 4
gpt4 key购买 nike

我刚刚在 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));

如果第二个参数不是可选的或不是int,编译器会报错,但在这种情况下,它只是偷偷地让你吃惊。

有没有人遇到过这个?还有哪些其他 Linq 表达式以这种方式工作? (到目前为止,.SelectMany() 可以)。解决此行为的最优雅方法是什么(并防止其他人陷入同样的​​陷阱?)

最佳答案

这实际上不是特定 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恰好作为添加了索引的重载存在。

关于c# - Linq .Select()/.SelectMany() 自动使用第二个可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39638756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com