通过无限循环生成元素返回 IEnumerable<T> 有不利的一面吗?

Is there a down side to returning an IEnumerable<T> via an infinite loop yielding elements?

这里的无限循环是否造成了负面影响? Resharper 警告我..

Function never returns

..但我看不出有任何缺点。

public static class RandomEntityFactory
{
    public static IEnumerable<T> Enumerate<T>() where T : class
    {
        while (true)
        {
            yield return Get<T>();
        }
    }

    public static T Get<T>() where T : class
    {
        if (typeof(T) == typeof(Client)) return CreateRandomClient() as T;
        if (typeof(T) == typeof(Font)) return CreateRandomFont() as T;

        throw new Exception("unknown type: " + typeof(T).Name);
    }
}

Is there a downside?

这取决于预期用途。如所写,一些 Linq 函数——主要是 AllCount——永远不会完成。只要消费者有办法在某个时候打破循环,使用延迟执行的 Linq 查询就没问题。客户端必须确保使用确定性函数,例如 TakeFirst(假设在某个时候 return 值将满足条件)。

如果预期的用途是让客户端使用 foreach 进行枚举,自行决定打破循环,那么无限期 return 项是合理的。

具有 "infinite" 可枚举本身不会导致任何问题。不过,您编写的特定代码看起来很奇怪。我会这样做:

static IEnumerable<long> Iota()
{
    long i = 0;
    while (true)
    {
        yield return i;
        i++;
    }
}

这是通用序列 0, 1, 2, ...

如果你想制作一个无穷无尽的随机字体序列,你可以这样做:

Iota().Select(_ => CreateRandomFont())

这避免了编写您的 Get 方法,这在我看来很糟糕。