C# 在队列中存储不同的操作(需要澄清)

C# 在队列中存储不同的操作(需要澄清),c#,lambda,queue,C#,Lambda,Queue,TLDR;为什么这样做。 Queue<Action> queue = new Queue<Action>(); queue.Enqueue(() => Load("Scene01")); Queue<Action> queue = new Queue<Action>(); queue.Enqueue(Load("Scene01")); 队列 问题 为什么可以使用lambda表达式传递与操作不匹配的函数 Qu

TLDR;为什么这样做。

    Queue<Action> queue = new Queue<Action>();
    queue.Enqueue(() => Load("Scene01"));
    Queue<Action> queue = new Queue<Action>();
    queue.Enqueue(Load("Scene01"));
队列

问题 为什么可以使用lambda表达式传递与操作不匹配的函数

Queue<Action> queue = new Queue<Action>();

private void Load() { }

private void Load(string n) { }

private void QueueLoad()
{
    // This match action signature.
    queue.Enqueue(Load);

    // This does not match, nor work.
    queue.Enqueue(Load("Scene01"));

    // Adding lambda expression and it works. Why?
    queue.Enqueue(() => Load("Scene01"));
}
Queue Queue=new Queue();
私有void Load(){}
私有无效加载(字符串n){}
私有void QueueLoad()
{
//此匹配动作签名。
排队。排队(加载);
//这不匹配,也不起作用。
排队(加载(“场景01”);
//添加lambda表达式,它就工作了。为什么?
queue.Enqueue(()=>Load(“Scene01”);
}
这是因为
Load
是一个可转换为
Action
的操作

queue.Enqueue(() => Load("Scene01"));
queue.Enqueue(Load("Scene01"));
这是因为lambda表达式不带任何参数,也不返回任何内容,因此可以隐式转换为
操作

queue.Enqueue(() => Load("Scene01"));
queue.Enqueue(Load("Scene01"));

这不起作用,因为
Load(“Scene01”)
是一个方法调用,该方法不返回任何内容,您正在尝试将
void
传递到
Enqueue
方法。

您的第二个代码块不起作用,因为您正在调用
Load
方法并返回其结果以存储在队列中。啊,现在我明白了。我注意到将“Load”更改为“Load()”会得到相同的结果。所以我猜lambda确保它是传递的实际函数。非常感谢,伙计,这让我很困惑。非常感谢你的解释。