在C#中,函数如何将IEnumerable接口作为返回类型?
所以我知道这个函数允许用foreach语句迭代结果,但我不知道返回类型如何成为接口在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
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
,实现迭代的具体类实际上是由编译器创建的,您从未见过它,这无助于澄清问题。