【问题标题】:Can you make a class enumerable via extension methods? In particular, System.Range您可以通过扩展方法使类可枚举吗?特别是 System.Range
【发布时间】: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,与其在执行时失败,不如让它根本不工作。

标签: c# c#-8.0


【解决方案1】:

不,foreach 循环不适用于扩展方法,不像(比如)await。它是基于模式的,因为它不需要实现IEnumerable<T> 或IEnumerable - 如果您有适当的GetEnumerator() instance 方法返回适当的类型( MoveNext() 和 Current 成员),没关系。但是编译器不会像您那样寻找GetEnumerator() 扩展方法。一直是proposed,但我不知道有什么计划这样做,如果它是在 C# 8 中,我会感到非常惊讶(考虑到list of features)。

你需要像这样写一个扩展方法:

 public static IEnumerable<int> AsEnumerable(this Range range)
 {
     ...
 }

然后你可以使用

 foreach (int x in (1..5).AsEnumerable())

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

基本上,范围主要用于在另一个上下文中进行切片,而不是独立的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 2014-02-13
    • 1970-01-01
    • 2014-10-02
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多