*** 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 回答
在使用几种方法来破解\修复代码后,我发现了一小部分信息 .
当编译器到达该行时
如果(并且我认为只有)它之前从未遇到过QueueTask,它将会编译 . 例如,声明类中的下一行(在SomeFunc方法之前或之后)
会修复编译 . 此外,添加errornouse行上方的下一行也将修复它
我已经使用QueueTask尝试了几行,并且他们工作(修复编译) .
我只能假设编译器没有加载QueueTask的定义,这导致了这种扼杀 .
似乎甚至像一个bug .
希望我能够很好地解释这一点 .
(这可能是一个评论,但在评论中提供完整的代码并不可行 . )
您的代码已经按原样运行:
编译没有问题 .
请创建一个类似的简短但完整的程序,不编译 .