我现在正在使用最新的C#8,我在玩弄新的System.Range,想看看是否有类似的东西
foreach (int i in 5..8)
{
}
Run Code Online (Sandbox Code Playgroud)
可能,但是在撰写本文时(使用绝对前沿的预览)给我一个错误。
然后,我想知道是否可以通过在静态类中执行以下操作来使它可枚举,因为也许foreach循环实际上并不在乎,只希望存在某种可用的方法,所以我尝试了:
public static IEnumerator GetEnumerator(this Range range)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是编译器对此不满意。
这可能吗?还是我只是实现了无数错误?IDE中的错误消息告诉我GetEnumerator()需要可以foreach运行,但是由于我无法访问该类并且不能简单地执行: IEnumerable<int>该操作,然后从该类生成方法并执行所需的操作,因此我不这样做不知道这是否表示我被卡住或编码是否错误。
我的错误:
foreach (int i in 1..5)
{
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
[CS1579] foreach语句无法对类型为“范围”的变量进行操作,因为“范围”不包含“ GetEnumerator”的公共实例定义
和
$ dotnet-版本
3.0.100-preview8-013656
以项目定位netcoreapp3.0并且C#语言级别是preview
不,foreach与(say)不同,循环不适用于扩展方法await。它是基于模式的,因为它不需要实现,IEnumerable<T>或者IEnumerable-如果您有返回适当类型(带有和成员)的适当GetEnumerator() 实例方法,那很好。但是编译器不会像您那样寻找扩展方法。它已经提出了,但是我不知道有什么计划,如果它在C#8中(考虑到功能列表),我会感到非常惊讶。MoveNext()CurrentGetEnumerator()
您需要编写如下扩展方法:
public static IEnumerable<int> AsEnumerable(this Range range)
{
...
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用
foreach (int x in (1..5).AsEnumerable())
Run Code Online (Sandbox Code Playgroud)
...但是如果两个索引都是“从头开始”而不是“从头开始”,您仍然需要弄清楚该怎么做,而且我不确定将其作为执行时间是否非常有用-只检查,真的。
基本上,范围主要是为在另一个上下文中切片而设计的,而不是独立的。