C#递归委托声明问题

时间:2010-07-05 18:28:56

标签: c# delegates declaration forward

*请注意重要编辑*

出于各种原因,我有类似的事情:

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

认为它有点令人费解!

2 个答案:

答案 0 :(得分: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的定义,这导致了这种扼杀。

似乎就像一个错误。

希望我能够很好地解释这一点。

答案 1 :(得分: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?
    }
}

编译没有问题。

请创建一个类似的简短但完整的程序编译。