【发布时间】:2021-06-21 01:37:09
【问题描述】:
我有一个返回 IEnumerable<T>(或 IEnumerable)的 API,它在 C# 中使用 yield return 在内部实现。
一个简单的例子:
public class Class1
{
public IEnumerable<int> Enumerate()
{
yield return 1;
}
}
在 PowerShell 中,我无法在 Enumerate() 方法返回的枚举上调用 IEnumerable<T>.GetEnumerator:
$cls = New-Object Class1
$enumerable = $cls.Enumerate()
Write-Host $enumerable.GetType()
$enumerator = $enumerable.GetEnumerator()
它失败了:
找不到“GetEnumerator”和参数计数的重载:“0”。
$enumerable.GetType() 预期返回:
Class1+d__0
C# 中的相同代码按预期工作。
如果该方法是使用普通的return 实现的:
return new[] { 1 };
那么PowerShell就没有问题了。
为什么 PowerShell 看不到 GetEnumerator()?
我发现了这个有点相关的问题:PowerShell/GetEnumerator,但它并没有真正给我答案/解决方案(或者我没有看到它)。
解释一下,为什么我想使用IEnumerator,而不是使用PowerShell foreach:我想使用使用Start-ThreadJob 启动的并行线程来处理可枚举。并且枚举是懒惰且耗时的。因此,在枚举之前将结果收集到某个容器中会降低性能。
【问题讨论】:
标签: c# .net powershell ienumerable yield-return