为什么编译器无法转换回调?

时间:2016-07-17 20:08:45

标签: c# .net delegates

示例代码

使用回调按预期工作:

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}}?

1 个答案:

答案 0 :(得分:2)

  

为什么编译器可以将匿名方法的方法签名与WaitCallback匹配......但它不能对AlternateWaitCallback执行相同的操作?

匿名方法没有内在类型(换句话说,它没有明确的类型);它只能转换为具有兼容签名的任何委托类型(在这种情况下为WaitCallback)。另一方面,AlternateWaitCallback是它自己的类型;您不能将类型转换为另一种类型,除非它们具有继承关系或者它们之间定义了转换。