示例代码
使用回调按预期工作:
public void DoWork(object state)
{
Console.WriteLine(state.ToString());
}
WaitCallback waitCallback = new WaitCallback(this.DoWork);
ThreadPool.QueueUserWorkItem(
waitCallback,
"Via: WaitCallback");
使用匿名方法也有效:
ThreadPool.QueueUserWorkItem(
(object stateInfo) => { DoWork(stateInfo); },
"via: anonymous method");
使用具有类似签名的委托......
AlternateWaitCallback alternateCallback = new AlternateWaitCallback(this.DoWork);
ThreadPool.QueueUserWorkItem(
alternateWaitCallback,
"Via: alternate WaitCallback");
...生成编译器错误:"无法从AlternateWaitCallback转换为WaitCallback'
问题
我知道delegate
关键字用于定义两个将作为回调的新类型。我不明白的是:为什么编译器可以将匿名方法的方法签名与WaitCallback
进行匹配...但它不能为AlternateWaitCallback
做同样的事情。 {1}}?
答案 0 :(得分:2)
为什么编译器可以将匿名方法的方法签名与
WaitCallback
匹配......但它不能对AlternateWaitCallback
执行相同的操作?
匿名方法没有内在类型(换句话说,它没有明确的类型);它只能转换为具有兼容签名的任何委托类型(在这种情况下为WaitCallback
)。另一方面,AlternateWaitCallback
是它自己的类型;您不能将类型转换为另一种类型,除非它们具有继承关系或者它们之间定义了转换。