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

这个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的返回类型。

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

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

编译器将自动生成一个实现IEnumerableIEnumerator的类(在同一个类中)。

Jon Skeet有详细的解释 。

该方法返回的IEnumerable的具体实现是编译器生成的匿名类型

 Console.WriteLine(GetIEnumerable().GetType()); 

印刷品:

 YourClass+d__0