【问题标题】:In C# how can a function have an IEnumerable Interface as a return type? [duplicate]在 C# 中,函数如何将 IEnumerable 接口作为返回类型? [复制]
【发布时间】:2017-01-19 16:39:52
【问题描述】:

所以我知道这个函数允许使用 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;
    }
}

在 MSDN 文档中它指出:

接口只定义签名

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

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

【问题讨论】:

  • 你可以返回任何实现IEnumerable&lt;int&gt;
  • 那么什么是接口,如果你认为它不存在,因此不能用于任何事情?显然,事实并非如此。具体的类可以实现一个接口。如果一个对象实现了IFoo,你可以将它的引用传递为IFoo。这就是他们的目的。在这种情况下,通过 yield return,编译器会神奇地创建一个具体的类来实现它。
  • 哦好的,我明白你在想什么。但这不是交易。您的方法所属的类与它无关。这完全不相关。例如,您可以编写一个返回String 的方法。这并不意味着你的类必须继承自String。您的功能与实现接口无关。它返回的对象必须实现接口。
  • ...但是!使用yield return,实现迭代的具体类实际上是由编译器创建的,而您从未见过它,这无助于澄清问题。

标签: c# ienumerable yield-return


【解决方案1】:

这意味着你可以返回任何实现接口的东西,调用代码不需要关心具体的实现是什么,但它可以使用接口中声明的返回对象的任何功能。

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

例如,您可以从函数中返回 List&lt;int&gt;,它是有效的。

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

【讨论】:

    【解决方案2】:

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

    作为一个简单的例子,你可以返回List&lt;int&gt;,它实现了IEnumerable&lt;int&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 2010-09-27
      相关资源
      最近更新 更多