C# 代表名单

C# 代表名单,c#,delegates,C#,Delegates,是否可以创建包含不同类型代理的列表? 例如,请考虑这两位代表: class MyEventArg1 : EventArgs {} class MyEventArg2 : EventArgs {} EventHandler<MyEventArgs1> handler1; EventHandler<MyEventArgs2> handler2; 类MyEventArg1:EventArgs{} 类MyEventArg2:EventArgs{} 事件处理程序句柄1; 事件处

是否可以创建包含不同类型代理的列表? 例如,请考虑这两位代表:

class MyEventArg1 : EventArgs {}
class MyEventArg2 : EventArgs {}

EventHandler<MyEventArgs1> handler1;
EventHandler<MyEventArgs2> handler2;
类MyEventArg1:EventArgs{}
类MyEventArg2:EventArgs{}
事件处理程序句柄1;
事件处理程序句柄2;
我想这样做:

List<EventHandler<EventArgs>> handlers = new List<EventHandler<EventArgs>>();

handlers.Add((EventHandler<EventArgs>)handler1);
handlers.Add((EventHandler<EventArgs>)handler2);
List handlers=newlist();
添加((EventHandler)handler1);
添加((EventHandler)handler2);
但从一名代表到另一名代表的角色转换似乎是不可能的。 我的目标是将代表存储在一个列表中,不给他们打电话;只是为了自动注销它们


谢谢

多亏了,在C#4.0中,您将能够做到这一点,但在此之前,您需要找到另一种方法(可能)。

是的,这不起作用,代理是完全不相关的类型。通常,泛型类型只有System.Object作为公共基类型。但是在这里,由于它们是委托,您可以将它们存储在
列表中。我怀疑这会帮你把它们注销。但是我真的无法想象这段代码会是什么样子。

泛型委托声明可以指定某些类型参数应该是协变或逆变的,这将允许您所追求的赋值类型。不幸的是,多播委托的内部实现使得不可能组合不同类型的委托(一个“简单的”委托保存有关其类型的信息,以及对其目标的方法指针和引用;多播委托保存有关其类型的信息以及对其每个组成委托的方法指针和目标引用,但不保存对组合的原始委托的任何引用,也不保存任何i有关其类型的信息)。因此,尝试将
EventHandler
EventHandler
组合将在运行时失败


如果
EventHandler
T
相反,则尝试将
EventHandler
传递给标准event
AddHandler
方法,该方法需要编译
EventHandler
,如果没有订阅其他处理程序,甚至会成功,因为
EventHandler
将是
Delegate。将
d与
null
组合,从而作为
EventHandler
存储在事件的Delegate字段中。不幸的是,随后添加
EventHandler
(实际上是预期的类型)的尝试将失败,因为它的类型与其组合的委托不匹配。微软认为这种行为违反了最小惊讶原则(如果传递“错误”的委托会导致任何问题,它应该在传递该委托时这样做,而不是在传递后一个委托时这样做),并决定通过将
EventHandler
传递给期望
EventHandler
的处理程序的尝试将编译失败,从而最大限度地降低出现这种情况的可能性,即使该行为可能会成功(如果它是唯一的订阅)。

我不确定这是否有帮助
EventHandler
在.NET中定义不变。