Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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
.net 为什么不能在一个简单的赋值中使用两种相同形状的委托类型?_.net_Casting_Delegates - Fatal编程技术网

.net 为什么不能在一个简单的赋值中使用两种相同形状的委托类型?

.net 为什么不能在一个简单的赋值中使用两种相同形状的委托类型?,.net,casting,delegates,.net,Casting,Delegates,我知道如何将两个形状相同的委托类型相互分配(使用赋值器委托的ctor)。但是我想知道为什么一个代理不需要任何额外的努力就不能分配给另一个代理(我的意思是del1=del2)。它背后的.net逻辑是什么? 考虑下面的代码: delegate void T1(int a, int b); delegate void T2(int a, int b); ... T1 t1 = (x,y) => x = 1; T2 t2 = T2(t1); //Issues Error! delegate v

我知道如何将两个形状相同的委托类型相互分配(使用赋值器委托的ctor)。但是我想知道为什么一个代理不需要任何额外的努力就不能分配给另一个代理(我的意思是del1=del2)。它背后的.net逻辑是什么? 考虑下面的代码:

delegate void T1(int a, int b);
delegate void T2(int a, int b);
...
T1 t1 = (x,y) => x = 1;
T2 t2 = T2(t1); //Issues Error!


delegate void T1<in T>(T obj);
delegate void T2<in T>(T obj);
...
T1<int> t1 = (x) => x = 1;
T2<int> t2 = t1;//Issues Error!
委托无效T1(int a,int b);
代表无效T2(内部a、内部b);
...
T1=(x,y)=>x=1;
T2=T2(t1)//问题错误!
代表无效T1(T obj);
代表无效T2(T obj);
...
T1=(x)=>x=1;
T2=t1//问题错误!

如果代理类型相同,则可以分配它们。这是小提琴-

它编译得很好,运行得很好。”将显示“手柄2”

更新1

您仍然可以基于T1创建T2类型。您不能直接从
T1
转换到
T2
,因为它们是不同的类型,即使具有相同的签名,但您仍然可以基于T1创建T2的实例。这是工作小提琴-

您收到的错误(至少我收到)不是在这种情况下不可能进行类型转换,而是
T2
在此上下文中不可用。这是因为
T2
是一种类型,不能像函数那样调用类型。要将一种类型转换为另一种类型,必须强制转换它:

T2 t2 = (T2) t1;
但是,这将失败,错误是无法进行转换。为什么呢?因为这两种类型仍然不同。即使两个类型的定义相同,它们仍然是不同且不兼容的类型,因此不能将一个指定给另一个

然而,代表们有点特殊。可以将兼容函数转换为类型化委托。这实际上在很多情况下都会发生,最显著的是在添加事件处理程序时,但通常会隐藏在语法糖中。例如,
obj.SomeEvent+=HandleSomeEvent
实际上是一个
obj.SomeEvent+=newsomeeventhandler(HandleSomeEvent)
;这已经是您在这里需要的线索:在创建新委托实例时,您可以将兼容函数传递给构造函数,并将创建一个具有该函数的新委托:

T1 t1 = (x, y) => x = 1;
T2 t2 = new T2(t1);

你能发布你的代码吗?Sahand,你的问题很有趣,但我建议你举两种情况的例子。@Oybek你说这两种都是什么意思?我只是提出了一个错误的案例。但有趣的是,我以前不知道,Sergey的代码很好用。我糊涂了!:(现在没事了。你已经照我说的做了。这个问题特别令人烦恼,因为BCL中所有不同的委托类型都是过时的,因为泛型是在2.0中添加的。你是对的,但它在更一般的情况下不起作用。我更新了帖子以反映它。谢谢你的回答,但是如果你注意到我在那里提到的帖子,这个问题问题可以通过另一个ctor实例化一个委托类型来解决。哦,似乎我错过了它。正如我在回答中所说的,如果一个类型与另一个类型不相关,则无法将它们转换为另一个类型。这适用于所有类型,而不仅仅是委托。在您的示例中,T1和T2是不同的类型。如果创建class
Base
还有两个继承者
Inheritor1
,和
Inheritor2
,那么你也不能将
Inheritor1
转换为
Inheritor2
,因为类型不同。我知道你的意思,但在委托的情况下有点不同,你可以将委托类型分配给另一个偶数类型,两者都不同,就像内德,tnx伙计,现在我明白了背后的道理
T2 t2 = (T2) t1;
T1 t1 = (x, y) => x = 1;
T2 t2 = new T2(t1);