IEnumerable.Select 在函数调用中重复输入参数

Ada*_*eck 2 c# linq select

我偶然发现了一种我意想不到的行为,也找不到相关文档。我有一个带有 2 个参数的函数,其中一个具有默认值。当在 Select 内部调用该函数时,它出于某种原因获取调用它的值并将其应用于两个参数。例子:

具有以下功能:

private static Directions PrintDir(Directions dir, int distance = 1) 
{
    Console.WriteLine($"Direction {dir}, distance {distance}");
    return dir;
}
Run Code Online (Sandbox Code Playgroud)

如果单独调用,它会按预期运行:

using System;
using System.Linq;
                    
public class Program
{
    enum Directions { Left, Up, Right, Down };
    
    public static void Main()
    {
        PrintDir(Directions.Left);
        PrintDir(Directions.Up);
        PrintDir(Directions.Right);
        PrintDir(Directions.Down);
    }
}
Run Code Online (Sandbox Code Playgroud)

印刷:

Direction Left, distance 1
Direction Up, distance 1
Direction Right, distance 1
Direction Down, distance 1
Run Code Online (Sandbox Code Playgroud)

但是当在 LINQ 表达式中调用时:

using System;
using System.Linq;
                
public class Program
{
    enum Directions { Left, Up, Right, Down };
    
    public static void Main()
    {
        var dirs = Enum.GetValues(typeof(Directions))
            .Cast<Directions>()
            .Select(PrintDir)
            .ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到:

Direction Left, distance 0
Direction Up, distance 1
Direction Right, distance 2
Direction Down, distance 3
Run Code Online (Sandbox Code Playgroud)

所以看起来 Directions 值已被正确应用为dir参数,但也转换为 int 并应用而不是默认值作为第二个distance参数。

为什么会发生这种情况?Select 内部函数的规则是什么?

Som*_*ody 7

有一个重载,Select其中也包含索引。如果您使用 lambda,您的代码将如下所示:

Select((item,index) => PrintDir(item, index))
Run Code Online (Sandbox Code Playgroud)

如果您想避免它,请Select像这样调用:

Select(item => PrintDir(item))
Run Code Online (Sandbox Code Playgroud)