首页 文章

C#递归委托声明问题

提问于
浏览
1

*** PLEASE SEE END FOR IMPORTANT EDIT ***

出于各种原因,我有类似的东西:

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) => {});
}

它不是一个巨大的问题,我知道我也可能通过传入另一个包含代表的对象而逃脱,但我很好奇是否有办法使其工作作为它的立场?

谢谢 .

*** IMPORTANT EDIT BELOW ***

似乎只有我将类'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

    在使用几种方法来破解\修复代码后,我发现了一小部分信息 .

    当编译器到达该行时

    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的定义,这导致了这种扼杀 .

    似乎甚至像一个bug .

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

  • 1

    (这可能是一个评论,但在评论中提供完整的代码并不可行 . )

    您的代码已经按原样运行:

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

    编译没有问题 .

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

相关问题