在C#中,函数如何将IEnumerable接口作为返回类型?

在C#中,函数如何将IEnumerable接口作为返回类型?,c#,ienumerable,yield-return,C#,Ienumerable,Yield Return,所以我知道这个函数允许用foreach语句迭代结果,但我不知道返回类型如何成为接口 public static IEnumerable<int> Func1(int number, int exponent) { int exponentNum = 0; int numberResult = 1; while (exponentNum < exponent) { numberResult *= number; e

所以我知道这个函数允许用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;
    }
}
公共静态IEnumerable Func1(整数,整数指数)
{
int-exponentNum=0;
int numberResult=1;
while(指数数<指数)
{
numberResult*=编号;
exponentNum++;
收益返回数结果;
}
}
在MSDN文档中,它指出:

接口仅定义签名

•接口不能直接实例化。其成员由实现接口的任何类或结构实现

public static IEnumerable<int> Func1(int number, int exponent)
{
    int exponentNum = 0;
    int numberResult = 1;

    while (exponentNum < exponent)
    {
        numberResult *= number;
        exponentNum++;

        yield return numberResult;
    }
}

因此,如果接口只包含方法签名,那么其中一个怎么可能是函数的返回类型呢?该函数如何启用foreach语句?

如果返回类型是接口,则可以从该函数返回实现该接口的任何具体类


作为一个简单的示例,您可以返回实现
IEnumerable
List
,如果返回类型是接口,则可以从函数返回实现该接口的任何具体类


作为一个简单的示例,您可以返回
List
,它实现了
IEnumerable

,这意味着您可以返回实现接口的任何内容,调用代码不必关心具体实现是什么,但它可以使用接口中声明的返回对象的任何函数

public static IEnumerable<int> Func1(int number, int exponent)
{
    int exponentNum = 0;
    int numberResult = 1;

    while (exponentNum < exponent)
    {
        numberResult *= number;
        exponentNum++;

        yield return numberResult;
    }
}
这是在代码的各个部分之间创建标准接口的一种方法,同时允许在不影响其他任何内容的情况下更改内部实现

例如,您可以从函数返回一个
列表
,它将是有效的


您的函数使用
yield return
,这意味着它将一次返回迭代的每个元素,并隐式地为您创建
IEnumerable
,而不是创建一个显式列表对象。在内部,它将创建一些实现
IEnumerable
的具体类型并返回该类型,但调用代码将只将其视为
IEnumerable
,因为这是方法的返回类型。提供了与您发布的函数非常相似的详细信息和示例。

这意味着您可以返回实现接口的任何内容,调用代码不必关心具体实现是什么,但它可以使用接口中声明的返回对象的任何函数

public static IEnumerable<int> Func1(int number, int exponent)
{
    int exponentNum = 0;
    int numberResult = 1;

    while (exponentNum < exponent)
    {
        numberResult *= number;
        exponentNum++;

        yield return numberResult;
    }
}
这是在代码的各个部分之间创建标准接口的一种方法,同时允许在不影响其他任何内容的情况下更改内部实现

例如,您可以从函数返回一个
列表
,它将是有效的


您的函数使用
yield return
,这意味着它将一次返回迭代的每个元素,并隐式地为您创建
IEnumerable
,而不是创建一个显式列表对象。在内部,它将创建一些实现
IEnumerable
的具体类型并返回该类型,但调用代码将只将其视为
IEnumerable
,因为这是方法的返回类型。提供了更多详细信息,以及一个与您发布的函数非常类似的示例。

您可以返回实现
IEnumerable
的任何内容。因此,如果您认为接口不存在,因此不能用于任何内容,那么接口是用于什么的?显然,情况并非如此。具体类可以实现接口。如果对象实现了
IFoo
,则可以将对它的引用作为
IFoo
传递。这就是他们的目的。在本例中,使用yield-return,编译器神奇地创建了一个实现它的具体类。但这不是交易。您的方法所属的类与此无关。这完全无关。例如,您可以编写一个返回
String
的方法。这并不意味着类必须从
String
继承。您的函数与实现接口无关。它返回的对象必须实现接口…然而!使用
yield return
,实现迭代的具体类实际上是由编译器在您从未见过的地方创建的,这无助于澄清问题。您可以返回实现
IEnumerable
的任何对象。因此,如果您认为接口不存在,因此不能用于任何对象,那么接口是用来做什么的?显然,情况并非如此。具体类可以实现接口。如果对象实现了
IFoo
,则可以将对它的引用作为
IFoo
传递。这就是他们的目的。在本例中,使用yield-return,编译器神奇地创建了一个实现它的具体类。但这不是交易。您的方法所属的类与此无关。这完全无关。例如,您可以编写一个返回
String
的方法。这并不意味着类必须从
String
继承。您的函数与实现接口无关。它返回的对象必须实现接口…然而!使用
yield return
,实现迭代的具体类实际上是由编译器创建的,您从未见过它,这无助于澄清问题。