C# 为什么可以';编译器转换回调?
示例代码 使用回调可以按预期工作:C# 为什么可以';编译器转换回调?,c#,.net,delegates,C#,.net,Delegates,示例代码 使用回调可以按预期工作: public void DoWork(object state) { Console.WriteLine(state.ToString()); } WaitCallback waitCallback = new WaitCallback(this.DoWork); ThreadPool.QueueUserWorkItem( waitCallback, "Via: WaitCallback"); 使用匿名方法也可以: ThreadPoo
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
执行相同的操作
为什么编译器可以将匿名方法的方法签名与WaitCallback
…匹配,但对AlternateWaitCallback
却不能这样做
匿名方法没有内在类型(换句话说,它不是明确类型);它只是可以转换为任何具有兼容签名的委托类型(WaitCallback
)另一方面,AlternateWaitCallback
是它自己的类型;除非它们之间有继承关系或定义了转换,否则不能将一个类型转换为另一个类型
为什么编译器可以将匿名方法的方法签名与WaitCallback
…匹配,但对AlternateWaitCallback
却不能这样做
匿名方法没有内在类型(换句话说,它不是明确类型);它只是可以转换为任何具有兼容签名的委托类型(WaitCallback
)另一方面,AlternateWaitCallback
是它自己的类型;除非它们之间有继承关系或定义了转换,否则不能将一个类型转换为另一个类型