【发布时间】:2020-01-05 17:26:57
【问题描述】:
我现在正在使用最新的 C# 8,正在玩弄新的 System.Range,想看看有没有类似的东西
foreach (int i in 5..8)
{
}
是可能的,但在撰写本文时(使用绝对前沿预览)给了我一个错误。
然后我想知道是否可以通过在静态类中执行以下操作来使其可枚举,因为foreach 循环可能实际上并不关心,只是希望某些方法的存在可用,所以我尝试了:
public static IEnumerator GetEnumerator(this Range range)
{
// ...
}
但是编译器对此并不满意。
这可能吗?还是我只是实施了可枚举的错误? IDE 中的错误消息告诉我 GetEnumerator() 需要可供 foreach 运行,但是由于我无权访问该类并且不能简单地执行 : IEnumerable<int> 然后从它并做需要做的事情,我不知道这是否意味着我被卡住了,或者我是否编码不正确。
我的错误:
foreach (int i in 1..5)
{
Console.WriteLine(i);
}
[CS1579] foreach 语句无法对“Range”类型的变量进行操作,因为“Range”不包含“GetEnumerator”的公共实例定义
和
$ dotnet --version
3.0.100-preview8-013656
项目目标为netcoreapp3.0,C# 语言级别为preview
【问题讨论】:
-
但是这个
foreach (int i in 5..8)应该可以直接使用而无需执行任何操作。 -
@CodingYoshi 我发布了确切的编译器错误、我的 C#/.NET 信息和项目参数,作为它无法正常工作或我搞砸的进一步证据。
-
你可以尝试使用常规的.NET 而不是核心,然后看看它是否有效?
-
@CodingYoshi 尝试常规 .NET 现在告诉我
System.Range is not defined。同样在我更改为常规 .NET 之前,我可以很好地使用范围(例如arr[1..4]),但不能在 foreach 循环中使用。 -
范围不是自然可枚举的,因为它们需要上下文。例如,您希望
foreach(int i in 1..^10)做什么? IMO,与其在执行时失败,不如让它根本不工作。