2010-07-05 138 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的定义,这导致了这种情况。

似乎就像一个错误。

希望我设法解释这一点。