1

*重要な編集については終わりをご覧ください*

さまざまな理由で、私は次のようなものを持っています:

delegate void Task(QueueTask queueTask); delegate void QueueTask(Task task);

Visual Studio Express 2008を使用すると、明示的なヘルプなしで関数でqueueTask()を呼び出して呼び出すかどうかを推測できないラムダ式を除いて、これは多かれ少なかれうまく機能します。

void MyTask(QueueTask queueTask)
{{
   queueTask(qt => {}); // queueTaskで失敗します1つのパラメータを取りませんか?
}

ただし、これは機能します。

void MyTask(QueueTask queueTask)
{{
   queueTask((QueueTask qt)=> {});
}

それは大きな問題ではなく、代わりにデリゲートを含む別のオブジェクトを渡すことでおそらく逃げることができることを私は知っていますが、それをスタンドとして機能させる方法があるかどうか興味がありましたか?

ありがとう。

*以下の重要な編集*

クラス'TaskPool2'を別のアセンブリに配置した場合にのみ、コンパイルエラーが発生するようです!?

名前空間テスト
{{
    パブリッククラスTaskPool2
    {{
        パブリックデリゲートvoidQueueTask(タスクタスク);
        パブリックデリゲートvoidTask(QueueTask queueTask);


        public void Queue(Task task){}
    }
}


名前空間MyApp
{{
    クラスプログラム
    {{
        static void SomeFunc()
        {{
            Test.TaskPool2 taskPool = new Test.TaskPool2();


            taskPool.Queue(queue => {Console.WriteLine( "A"); queue(q => Console.WriteLine( "C"));});
        }
    }
}

そのやや複雑なことを認めた!

4

2 に答える 2

1

コードを壊す/修正するいくつかの方法を使用した後、少しの情報を見つけました。

コンパイラが次の行に到達したとき

taskPool.Queue(queue => { Console.WriteLine("A"); queue(q => Console.WriteLine("C")); });

以前に QueueTask に遭遇したことがない場合 (そして私はその場合のみだと思います)、コンパイルに失敗します。たとえば、クラスの次の行を宣言する (SomeFunc メソッドの前または後)

Public Delegate Test.TaskPool2.QueueTask x;

コンパイルを修正します。また、errornouse 行の上に次の行を追加すると、それも修正されます

Test.TaskPool2.QueueTask x; // declare x to be QueueTask

QueueTask を使用してさらに数行試してみましたが、うまくいきました (コンパイルを修正してください)。

コンパイラが QueueTask の定義をロードしないとしか思えず、これがこの混乱につながります。

バグのようにさえ思えます。

これをうまく説明できたことを願っています。

于 2010-10-17T12:13:21.347 に答える
0

(これはコメントでしたが、コメントで完全なコードを提供することは現実的ではありません。)

あなたのコードはそのままで動作します:

delegate void Task(QueueTask queueTask);
delegate void QueueTask(Task task);

class Test
{
    void MyTask(QueueTask queueTask)
    {
        queueTask(qt => {}); // fails with queueTask doesn't take 1 parameter?
    }
}

問題なくコンパイルされます。

同様に短いがコンパイルされない完全なプログラムを作成してください。

于 2010-07-05T18:33:52.370 に答える