我偶然发现了一种我意想不到的行为,也找不到相关文档。我有一个带有 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 内部函数的规则是什么?
有一个重载,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)