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)
它是编译器生成的类型.编译器生成一个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>.
无论如何,我会让你对我在精神上发布的内容进行代码更正.
*这纯粹是为了说明目的; 我没有声称它的真实准确性.根据我在自己的调查中看到的证据,它只是以一般方式证明编译器如何做它的作用.
编译器会自动生成实现两者的一类IEnumerable<T>和IEnumerator<T>(在相同的类).