IEnumerable这样的接口如何在没有正确实现的情况下工作?

sc0*_*tbr 2 c# ienumerable interface

根据我对接口的理解,为了使用它们,你必须通过在冒号后面添加接口的名称来声明一个类正在实现它,然后实现这些方法.

我目前正在学习枚举器,IEnumerable等等,这让我很困惑.这是我的意思的一个例子:

static IEnumerable<int> Fibs(int fibCount)
{
    for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++) {
        yield return prevFib;
        int newFib = prevFib + curFib;
        prevFib = curFib;
        curFib = newFib;
    }
}
Run Code Online (Sandbox Code Playgroud)

IEnumerable似乎是一个普通的接口,我甚至检查了方法定义,这就是它的样子.

我怎么可能在方法定义中使用接口作为类型/返回类型,何时/如何知道我应该使用某些接口作为此示例中的类型?

编辑:我真的怀疑它与yield关键字有什么关系,因为很多接口都以这种方式用作属性,例如在模型中的MVC中,并像它一样传递给Views.例:

public IEnumerable<Category> Categories {get;set;}
Run Code Online (Sandbox Code Playgroud)

Jep*_*sen 6

使用yield关键字时会有额外的魔力,即创建迭代器块.编译器为您创建状态机.

所以C#在这里有一个特殊的功能,它只有这个功能IEnumerable<>.所以C#语言是神奇的.

界面IEnumerable<>本身就是一种无聊的普通类型.没有魔法.

注:从技术上讲,yield魔术作品时,"正式的"返回类型为IEnumerable<>,IEnumerator<>,IEnumerable,或IEnumerator,但通常使用第一种.当然,不要去非通用.