在调查这个问题时,我很好奇C#4.0中新的协方差/逆变特性将如何影响它.
在Beta 1中,C#似乎不同意CLR.回到C#3.0,如果你有:
public event EventHandler<ClickEventArgs> Click;
Run Code Online (Sandbox Code Playgroud)
......然后你在其他地方:
button.Click += new EventHandler<EventArgs>(button_Click);
Run Code Online (Sandbox Code Playgroud)
...编译器会barf,因为它们是不兼容的委托类型.但是在C#4.0中,它编译得很好,因为在CLR 4.0中,类型参数现在被标记为in,因此它是逆变的,因此编译器假定多播委托+=将起作用.
这是我的测试:
public class ClickEventArgs : EventArgs { }
public class Button
{
public event EventHandler<ClickEventArgs> Click;
public void MouseDown()
{
Click(this, new ClickEventArgs());
}
}
class Program
{
static void Main(string[] args)
{
Button button = new Button();
button.Click += new EventHandler<ClickEventArgs>(button_Click);
button.Click += new EventHandler<EventArgs>(button_Click);
button.MouseDown();
}
static void button_Click(object s, EventArgs e)
{
Console.WriteLine("Button was clicked");
}
} …Run Code Online (Sandbox Code Playgroud)