Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#递归委托声明问题_C#_Delegates_Declaration_Forward - Fatal编程技术网

C#递归委托声明问题

C#递归委托声明问题,c#,delegates,declaration,forward,C#,Delegates,Declaration,Forward,*有关重要编辑,请参见结尾* 出于各种原因,我有如下想法: 委托无效任务(QueueTask QueueTask); 委托任务(任务任务); 使用Visual Studio Express 2008,除了在lambda表达式中无法推断我是否在没有明确帮助的情况下尝试调用函数中的call and call queueTask()之外,这或多或少都可以正常工作: void MyTask(QueueTask queueTask) { queueTask(qt => {}); // fails

*有关重要编辑,请参见结尾*

出于各种原因,我有如下想法:


委托无效任务(QueueTask QueueTask);
委托任务(任务任务);

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

void MyTask(QueueTask queueTask) { queueTask(qt => {}); // fails with queueTask doesn't take 1 parameter? } void MyTask(QueueTask QueueTask) { queueTask(qt=>{});//失败,queueTask不接受1个参数? } 不过,这是可行的:

void MyTask(QueueTask queueTask) { queueTask((QueueTask qt) => {}); } 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 { 公共委托无效队列任务(任务任务); 公共委托无效任务(QueueTask QueueTask); 公共无效队列(任务){} } } 名称空间MyApp { 班级计划 { 静态void SomeFunc() { Test.TaskPool2 taskPool=new Test.TaskPool2(); Queue(Queue=>{Console.WriteLine(“A”);Queue(q=>Console.WriteLine(“C”);}); } } } 就算它有点复杂

(这可能是一个注释,但在注释中给出完整的代码实际上是不可行的。)

您的代码已按原样运行:

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?
    }
}
编译没有问题

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

(这可能是一个注释,但在注释中给出完整的代码并不切实可行。)

您的代码已按原样运行:

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?
    }
}
编译没有问题


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

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

当编译器到达该行时

taskPool.Queue(queue => { Console.WriteLine("A"); queue(q => Console.WriteLine("C")); });
如果(我认为只有当)它以前从未遇到过QueueTask,它才会失败。 例如,声明类中的下一行(SomeFunc方法之前或之后)

将修复编译。 此外,在errornouse行上方添加下一行也将修复它

Test.TaskPool2.QueueTask x; // declare x to be QueueTask
我使用QueueTask又尝试了几行,它们都成功了(修复了编译)

我只能假设编译器没有加载QueueTask的定义,这导致了这种转换

看起来甚至像一只虫子


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

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

当编译器到达该行时

taskPool.Queue(queue => { Console.WriteLine("A"); queue(q => Console.WriteLine("C")); });
如果(我认为只有当)它以前从未遇到过QueueTask,它才会失败。 例如,声明类中的下一行(SomeFunc方法之前或之后)

将修复编译。 此外,在errornouse行上方添加下一行也将修复它

Test.TaskPool2.QueueTask x; // declare x to be QueueTask
我使用QueueTask又尝试了几行,它们都成功了(修复了编译)

我只能假设编译器没有加载QueueTask的定义,这导致了这种转换

看起来甚至像一只虫子


希望我能解释清楚。

请发布实际复制错误的代码。很抱歉,请查看我的编辑!这让我更加好奇!请发布实际复制错误的代码。很抱歉,请查看我的编辑!这让我更加好奇!很抱歉,请查看我的编辑。令人惊讶的是,我在编译的东西上出错了!很抱歉,请查看我的编辑。令人惊讶的是,我在编译的东西上出错了!