您可以通过扩展方法使一个可枚举的类吗?特别是System.Range

Wat*_*ter 0 c# c#-8.0

我现在正在使用最新的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

Jon*_*eet 6

不,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)

...但是如果两个索引都是“从头开始”而不是“从头开始”,您仍然需要弄清楚该怎么做,而且我不确定将其作为执行时间是否非常有用-只检查,真的。

基本上,范围主要是为在另一个上下文中切片而设计的,而不是独立的。