1

何が起こっているのかを本当に理解せずに、Visual Studio がコードを修正することを許可しないように、私は本当に懸命に努力しています。しかし、ここで問題を解決するのに役立ちました。続行する前に、何が起こっているのかを理解したいと思います.

ドキュメントを読むと、メソッドを引数として渡していると思いますか? 引数として渡すときはなぜ 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() から返された IEnumerable を Foo に渡しています。したがって、実際には Foo を呼び出す前に ExposureIterator を実行しています。言い換えれば、あなたはこれをやっています:

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

呼び出すexposureIterator()には、() がパラメーターを持っている場合にメソッドを呼び出す必要があり、() はそれらのパラメーターの開始と終了を指定します。

于 2013-09-20T16:37:45.797 に答える