Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';编译器转换回调?_C#_.net_Delegates - Fatal编程技术网

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
是它自己的类型;除非它们之间有继承关系或定义了转换,否则不能将一个类型转换为另一个类型