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);
}
我正在尝试实现 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);
}