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

In C# how can a function have an IEnumerable Interface as a return type?

所以我明白这个函数允许用foreach语句迭代结果,但我不明白return类型怎么可以是一个接口。

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 文档中它指出:

The interface defines only the signature

• An interface can't be instantiated directly. Its members are implemented by any class or struct that implements the interface.

因此,如果接口只包含方法签名,那么一个函数怎么可能是 return 类型的呢?以及这个函数如何启用foreach语句?

如果 return 类型是一个接口,任何实现该接口的具体 class 都可以从函数中 return。

作为一个简单的示例,您可以 return List<int>,它实现了 IEnumerable<int>.

表示你可以return任何实现接口的东西,调用代码不需要关心具体实现是什么,但是可以使用returned的任何函数在接口中声明的对象。

这是您在部分代码之间创建标准接口的一种方式,同时允许更改内部实现而不影响其他一切。

例如,您可以从函数中 return List<int>,它是有效的。

你的函数使用 yield return,这意味着它会 return 迭代的每个元素一次一个,并隐式地为你创建 IEnumerable<int>,而不是你创建一个显式的列表对象。在内部,它会创建一些实现 IEnumerable 和 return 的具体类型,但调用代码只会将其视为 IEnumerable,因为这是方法的 return 类型。 https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx 为您提供了更多详细信息以及与您发布的功能非常相似的示例。