什么具体类型’收益率’回报?
这个IEnumerable
的具体类型是什么?
private IEnumerable GetIEnumerable() { yield return "a"; yield return "a"; yield return "a"; }
它是编译器生成的类型。 编译器生成一个IEnumerator
实现,它返回三个“a”值和一个IEnumerable
框架类,它在其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 { 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 { public IEnumerator GetEnumerator() { return new GetIEnumerable_Enumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
或者,正如SLaks在他的回答中所说,这两个实现最终都在同一个类中。 我根据我之前看过的生成代码的不稳定记忆写了这个; 实际上,一个类就足够了,因为上述function没有理由要求两个。
实际上,考虑到它,这两个实现应该属于单个类,因为我只记得使用yield
语句的函数必须具有IEnumerable
或 IEnumerator
的返回类型。
无论如何,我会让你对我在精神上发布的内容进行代码更正。
*这纯粹是为了说明目的; 我没有声称它的真实准确性。 根据我在自己的调查中看到的证据,它只是以一般方式展示编译器如何做它的作用。
编译器将自动生成一个实现IEnumerable
和IEnumerator
的类(在同一个类中)。
Jon Skeet有详细的解释 。
该方法返回的IEnumerable
的具体实现是编译器生成的匿名类型
Console.WriteLine(GetIEnumerable().GetType());
印刷品:
YourClass+d__0