【问题标题】:Passing an IEnumerable as an argument in C#, why is this the correct syntax? What does it mean?在 C# 中将 IEnumerable 作为参数传递,为什么这是正确的语法?这是什么意思?
【发布时间】:2013-09-20 16:33:36
【问题描述】:

我非常努力不让 Visual Studio 允许我在没有真正了解发生了什么的情况下修复代码。但是在这里它帮助我解决了一个问题,我想确保在继续之前我了解发生了什么。

阅读文档让我觉得我在传递一个方法作为参数?为什么在将它作为参数传递时,我必须在 exposureIterator() 的末尾使用 () 而不是仅使用 exposureIterator(下面的第一个 Bar 方法是正确的)?我觉得我一定是有一个史诗般的大脑放屁,或者错过了一些非常重要的东西。真希望是前者……

感谢您的帮助:)

public void Foo (Ienumerable iterator)
{
    ...
}

public static System.Collections.IEnumerable exposureIterator()
{
    for (int i = 20; i < 55; i += 5)
    {
        yield return i.ToString();
    }
}

public void Bar()
{
    Foo(exposureIterator());
}

VS

public void Bar()
{
    Foo(exposureIterator);
}

编辑:刚刚意识到。 System.Collections.IEnumerable 只是一个返回类型,它被这样引用让我感到困惑。呼噜呼噜。再次感谢大家的澄清:)

【问题讨论】:

  • Foo(IEnumerable iterator) 需要一个 IEnumerable。 ExposeIterator() 返回一个 IEnumerable。因此,当您调用 Foo(exposeIterator()) 时,您会将 ExposeIterator() [an IEnumerable] 的结果传递给 Foo。

标签: c# arguments


【解决方案1】:

您将方法的结果作为参数传递。 () 表示有一个函数调用,并且在将结果设置为您的 Foo() 方法之前首先对其进行评估。当您排除 () 时,您实际上是将方法作为参数传递。这在某些情况下是有效的,但仅当参数类型是委托类型时(如果您不确定我在说什么,请在此处阅读委托:http://msdn.microsoft.com/en-us/library/ms173171(v=vs.90).aspx)。

你可以这样想你的代码:

public void Bar() {
    // call exposureIterator method and store result in a local variable
    IEnumerable result = exposureIterator();
    // pass local variable containing IEnumerable object to your method
    Foo(result);
}

【讨论】:

  • 哈哈谢谢!这个问题很有意义,同时让我觉得自己像个呆子。可能应该得到更多的睡眠:D
【解决方案2】:

您实际上并没有传递一个方法,而是传递了一个方法的结果。

public void Foo (Ienumerable iterator)
{
    ...
}

Foo(IEnumerable iterator) 需要一个 IEnumerable 对象。

exposeIterator() 返回一个IEnumerable 对象。所以当你打电话时:

public void Bar()
{
    Foo(exposureIterator());
}

您实际上传递了exposeIterator() 的结果,它是一个IEnumerable。相当于:

public void Bar()
{
    IEnumerator enumerator = exposeEnumerator;
    Foo(enumerator);
}

您还应该知道,在某些情况下,方法签名实际上可能要求将方法引用作为参数。在这些情况下,您确实会删除 () 以传递参数。

【讨论】:

    【解决方案3】:

    要调用exposureIterator(),您需要 () 来调用该方法,如果它有参数,则 () 将指定这些参数的开始和结束。

    【讨论】:

      【解决方案4】:

      在第一个实例中,您将从 exposureIterator() 返回的 IEnumerable 传递给 Foo;所以它实际上是在调用Foo之前​​执行exposureIterator;换句话说,你正在这样做:

      public void Bar()
      {
          IEnumerable x = exposureIterator();
          Foo(x);
      }
      

      【讨论】:

        猜你喜欢
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        • 2022-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多