【发布时间】:2016-07-02 18:30:53
【问题描述】:
示例代码
int id = 123;
ThreadPool.QueueUserWorkItem(state => ThreadEntryPoint((int)state), id);
public void ThreadEntryPoint(int uniqueId)
{
Console.WriteLine("uniqueId=" + uniqueId);
}
问题
根据提供的 LAMBDA 表达式,编译器如何知道它需要创建 QueueUserWorkItem(WaitCallback, Object) 的实例?
更具体地说:我知道它是在推断委托类型。我不明白的是(从高层次上)选择正确的委托类型进行实例化的决策树是什么?
参考文献
-
ThreadPool.QueueUserWorkItem
ThreadPool.QueueUserWorkItem(WaitCallback, Object)
-
WaitCallback Delegate
QueueUserWorkItem(WaitCallback, Object)QueueUserWorkItem(WaitCallback)
【问题讨论】:
-
实际上编译器不会创建任何实例,它不会创建
QueueUserWorkItem的实例,因为那是一种方法。但是QueueUserWorkItem方法需要一个WaitCallback委托,并且委托本身被指定为没有返回类型 (void) 并采用一个参数 (object),例如public delegate void WaitCallback(Object state);。您编写的 lambda 语句代表一个匿名方法。所以这个匿名方法将被“封装”在WaitCallback委托中(添加到调用列表中)。
标签: c# .net reflection lambda