C# 迭代器不能包含 return 语句

C# Iterator can not contain return statement

我正在尝试实现 python 就像 c# 中的范围数据结构 实现 IEnumerable<int>.

我的 Range 结构有 3 个整数字段:start, stop, step.

我还编写了 RangeIterator 数据结构,它实现 IEnumerator<int> 并接受范围对象到它的构造函数。因为我想解耦 range iterator 对象和范围对象。

然后在 Range 结构中我写:

    public IEnumerator<int> GetEnumerator()
    {
        return new RangeIterator(ref this);
    }

一切正常。

但有些情况下,由于 start, stop, step 参数,哪些范围不应生成数字。我想在创建 RangeIterator 对象进行优化之前检查它是否应该生成数字。

我将代码更改为:

        public IEnumerator<int> GetEnumerator()
        {
            if (!ShouldGenerate)
            {
                yield break;
            }
            return new RangeIterator(ref this);
        }

但是它说

Iterator can not contain return statement

在这种情况下如何避免创建 RangeIterator

对不起,英语不是我的母语。

编辑 1:

我在 this answer 中找到了错误原因,但我不知道如何避免创建不需要的枚举器对象。

可能与此类似:

public IEnumerator<int> GetEnumerator()
{
   return (ShouldGenerate) ? new RangeIterator(ref this) : new RangeIterator(); // an empty iterator
}

I found error reason in this answer but I haven't any idea how to avoid creating enumerator object if it isn't needed.

您无法避免枚举器对象,因为不允许返回 null。但是您可以通过使用 static singleton 实例来避免不必要的枚举器对象分配(因为空枚举器根据定义是不可变的)。例如,像这样使用从 Enumerable.Empty<T>() 返回的

public IEnumerator<int> GetEnumerator()
{
    if (!ShouldGenerate)
        return Enumerable.Empty<int>().GetEnumerator();
    return new RangeIterator(ref this);
}