【发布时间】:2017-01-19 16:39:52
【问题描述】:
所以我知道这个函数允许使用 foreach 语句迭代结果,但我不明白返回类型如何成为接口。
public static IEnumerable<int> Func1(int number, int exponent)
{
int exponentNum = 0;
int numberResult = 1;
while (exponentNum < exponent)
{
numberResult *= number;
exponentNum++;
yield return numberResult;
}
}
在 MSDN 文档中它指出:
接口只定义签名
• 不能直接实例化接口。它的成员由任何实现该接口的类或结构体实现。
如果接口只包含方法签名,那么怎么可能是函数的返回类型呢?这个函数是如何启用foreach语句的?
【问题讨论】:
-
你可以返回任何实现
IEnumerable<int> -
那么什么是接口,如果你认为它不存在,因此不能用于任何事情?显然,事实并非如此。具体的类可以实现一个接口。如果一个对象实现了
IFoo,你可以将它的引用传递为IFoo。这就是他们的目的。在这种情况下,通过 yield return,编译器会神奇地创建一个具体的类来实现它。 -
哦好的,我明白你在想什么。但这不是交易。您的方法所属的类与它无关。这完全不相关。例如,您可以编写一个返回
String的方法。这并不意味着你的类必须继承自String。您的功能与实现接口无关。它返回的对象必须实现接口。 -
...但是!使用
yield return,实现迭代的具体类实际上是由编译器创建的,而您从未见过它,这无助于澄清问题。
标签: c# ienumerable yield-return