1

* 重要编辑请见结尾 *

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

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

当然,它有点令人费解!

4

2 回答 2

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

似乎甚至像一个错误。

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

于 2010-10-17T12:13:21.347 回答
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?
    }
}

编译没有问题。

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

于 2010-07-05T18:33:52.370 回答