什么具体类型'收益率'回报?

sta*_*ker 9 c# ienumerable yield-return

具体类型是IEnumerable<string>什么?

private IEnumerable<string> GetIEnumerable()
{
    yield return "a";
    yield return "a";
    yield return "a";
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*Tao 8

它是编译器生成的类型.编译器生成一个IEnumerator<string>返回三个"a"值的实现和一个IEnumerable<string>在其GetEnumerator方法中提供其中一个的骨架类.

生成的代码看起来事情是这样*:

// No idea what the naming convention for the generated class is --
// this is really just a shot in the dark.
class GetIEnumerable_Enumerator : IEnumerator<string>
{
    int _state;
    string _current;

    public bool MoveNext()
    {
        switch (_state++)
        {
            case 0:
                _current = "a";
                break;
            case 1:
                _current = "a";
                break;
            case 2:
                _current = "a";
                break;
            default:
                return false;
        }

        return true;
    }

    public string Current
    {
        get { return _current; }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }

    void IEnumerator.Reset()
    {
        // not sure about this one -- never really tried it...
        // I'll just guess
        _state = 0;
        _current = null;
    }
}

class GetIEnumerable_Enumerable : IEnumerable<string>
{
    public IEnumerator<string> GetEnumerator()
    {
        return new GetIEnumerable_Enumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,正如SLaks在他的回答中所说,这两个实现最终都在同一个类中.我根据我之前看过的生成代码的不稳定记忆写了这个; 实际上,一个类就足够了,因为上述功能没有理由要求两个.

其实,细想起来,这两种实现真正应该落在一个单独的类中,我只记得使用该函数yield语句必须返回类型要么 IEnumerable<T> IEnumerator<T>.

无论如何,我会让你对我在精神上发布的内容进行代码更正.

*这纯粹是为了说明目的; 我没有声称它的真实准确性.根据我在自己的调查中看到的证据,它只是以一般方式证明编译器如何做它的作用.

  • 此外,编译器生成的类型在您的示例中将具有名称`<GetIEnumerable> d__0`.(是的,`<`和`>`是*类型名*的一部分.你不能在C#中写这样的类型名,但它在CLR中是有效的.)该类型嵌套在声明的类型中. `GetIEnumerable()`方法. (2认同)

SLa*_*aks 7

编译器会自动生成实现两者的一类IEnumerable<T>IEnumerator<T>(在相同的类).

Jon Skeet有一个详细的解释.

  • 请在您的答案中添加链接的相关部分 (2认同)