类似IEnumerable的接口没有正确的实现是如何工作的?

27 浏览
0 Comments

类似IEnumerable的接口没有正确的实现是如何工作的?

据我对接口的理解,为了使用它们,您必须声明一个类实现了它,方法为在冒号后添加接口的名称,然后实现接口的方法。

我正在学习枚举器、IEnumerable等内容,这使我感到困惑。以下是一个示例来说明我的意思:

static IEnumerable 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;
    }
}

IEnumerable似乎就像其他任何普通的接口一样,我甚至检查了方法定义,大体上都是这个样子。

我如何才能在方法定义中使用接口作为类型/返回类型?我如何知道何时应该使用特定的接口类型,就像在这个例子中一样?

编辑:我真的怀疑这与yield关键词没有任何关系,因为很多接口都以这种方式用作MVC中的属性,例如在模型中并像这样传递到视图中。示例:

public IEnumerable Categories {get;set;}

admin 更改状态以发布 2023年5月21日
0
0 Comments

IEnumerable是一个特殊的情况。 yield返回语句指示编译器添加实现IEnumerable的代码。

至于您的编辑
如果接口用作属性的类型,则任何实现此接口的类的对象都可以分配,并且该属性将返回实现此接口的对象。 在您的示例中,可以分配实现IEnumerable的任何类别集合,例如List。 与仅使用List相比,使用接口允许分配更广泛的对象。 该接口定义与属性相关的抽象要求。

0
0 Comments

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

C#在这里有一个特殊的功能,而且只有在IEnumerable<>中才有这个功能。所以这是C#语言的魔力。

IEnumerable<>接口本身是一个无聊的普通类型。没有任何魔法。

注意:从技术上讲,当“正式”的返回类型是IEnumerable<>IEnumerator<>IEnumerableIEnumerator时,yield魔法才能起作用,但通常你会使用前面的那个。当然不要去非泛型化。

0