2010-07-05 136 views
1

*請參閱END重要編輯*C#遞歸委託聲明問題

由於各種原因,我有這樣的:

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

使用Visual Studio Express 2008的這部作品或多或少罰款除了在lambda表達式中,它不能推導出如果我嘗試調用並在沒有明確幫助的情況下調用queueTask():

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

這工作雖然:

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

它不是一個巨大的問題,我知道我還可以或許通過傳遞包含了委託,而不是另一個對象離開,但我很好奇,如果有辦法使它作爲看臺工作?

謝謝。

*重要編輯下面*

似乎只有當我把這個類的TaskPool2「在單獨的程序我得到的編譯錯誤!?

 
namespace Test 
{ 
    public class TaskPool2 
    { 
     public delegate void QueueTask(Task task); 
     public delegate void Task(QueueTask queueTask); 


     public void Queue(Task task) { } 
    } 
} 


namespace MyApp 
{ 
    class Program 
    { 
     static void SomeFunc() 
     { 
      Test.TaskPool2 taskPool = new Test.TaskPool2(); 


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

承認它有些複雜!

+0

請張貼實際上重現錯誤的代碼。 – 2010-07-05 18:36:40

+0

對不起,請參閱我的編輯!這讓我更加好奇! – iam 2010-07-06 13:32:44

回答

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? 
    } 
} 

沒有問題編譯。

請創建一個同樣簡短但完整的程序,其中不會編譯。

+0

對不起,請參閱我的編輯。 令人驚訝的是,我編譯的東西出錯了! – iam 2010-07-06 13:33:20

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的定義,這導致了這種情況。

似乎就像一個錯誤。

希望我設法解釋這一點。