【问题标题】:C# recursive delegate declaration problemC#递归委托声明问题
【发布时间】:2011-03-12 00:33:17
【问题描述】:

* 重要编辑请见结尾 *

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

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

使用 Visual Studio Express 2008,除了在 lambda 表达式中,如果我在没有明确帮助的情况下尝试在函数中调用和调用 queueTask() 时它无法推断,这或多或少都可以正常工作:

无效我的任务(队列任务队列任务) { queueTask(qt => {}); // 由于 queueTask 不带 1 个参数而失败? }

这可行:

无效我的任务(队列任务队列任务) { queueTask((QueueTask qt) => {}); }

这不是一个大问题,我知道我也可以通过传入另一个包含委托的对象来逃避,但我很好奇是否有办法让它按原样工作?

谢谢。

* 以下重要编辑 *

似乎只有将“TaskPool2”类放在单独的程序集中才会出现编译错误!?

命名空间测试 { 公共类TaskPool2 { 公共委托无效队列任务(任务任务); 公共委托无效任务(队列任务队列任务); 公共无效队列(任务任务){} } } 命名空间 MyApp { 课堂节目 { 静态无效 SomeFunc() { Test.TaskPool2 taskPool = new Test.TaskPool2(); taskPool.Queue(queue => { Console.WriteLine("A"); queue(q => Console.WriteLine("C")); }); } } }

虽然有点复杂!

【问题讨论】:

  • 请发布实际重现错误的代码。
  • 对不起,请看我的编辑!这让我更加好奇!

标签: c# delegates declaration forward


【解决方案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 的定义,这导致了这种束缚。

看起来甚至像一个错误。

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

【讨论】:

    【解决方案2】:

    (这本来是一个注释,但在 cmets 中给出完整代码并不可行。)

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

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

    编译没有问题。

    请创建一个类似的短而完整的程序,不能编译。

    【讨论】:

    • 抱歉,请参阅我的编辑。令人惊讶的是我在编译的时候出了点问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多