public static IEnumerable<T> Pipe<T>(this IEnumerable<T> source, Action<T> action)
{
return _(); IEnumerable <T> _()
{
foreach (var element in source)
{
action(element);
yield return element;
}
}
}
我在 MoreLinq 存储库中找到了这段代码,但无法理解这一行:
return _(); IEnumerable <T> _()
最佳答案
此代码使用了 C# 的一项相对较新的功能,称为 local function .这个函数唯一不同寻常的地方在于它的名字:开发人员为它使用了一个下划线。因此,函数的名称是 _
,所以调用看起来像这样:_()
现在您知道了 return
语句返回调用名为 _
的本地函数的结果,其余的语法就位:
// This is a local function
IEnumerable <T> _() {
...
}
(OP's comment on the question) Can't we just do
foreach
withyield return
?
您复制的方法包括另外两行,这是理解差异的关键:
public static IEnumerable<T> Pipe<T>(this IEnumerable<T> source, Action<T> action)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (action == null) throw new ArgumentNullException(nameof(action));
return _(); IEnumerable <T> _()
{
foreach (var element in source)
{
action(element);
yield return element;
}
}
}
如果你输入 foreach
与 yield return
直接进入Pipe<T>
的正文方法,参数检查将被推迟,直到你开始迭代你的 IEnumerable<T>
结果。有了本地功能,您将尽快进行检查 Pipe<T>
被调用,即使在调用者从不迭代结果的情况下也是如此。
关于c# - 谁能解释这个枚举器语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47990969/