1

我非常努力地不让 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 只是一个返回类型,它被这样引用让我感到困惑。呼噜呼噜。再次感谢大家的澄清:)

4

4 回答 4

7

您将方法的结果作为参数传递。这()意味着有一个函数调用,并且在将结果设置为您的Foo()方法之前首先对其进行评估。实际上,当您排除时,()您将方法作为参数传递。这在某些情况下是有效的,但仅当参数类型是委托类型时(如果您不确定我在说什么,请在此处阅读委托:http: //msdn.microsoft.com/en-us/库/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);
}
于 2013-09-20T16:37:23.290 回答
3

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

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);
}

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

于 2013-09-20T16:38:55.213 回答
1

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

于 2013-09-20T16:37:45.797 回答
1

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

public void Bar()
{
    IEnumerable x = exposureIterator();
    Foo(x);
}
于 2013-09-20T16:39:13.237 回答