相关疑难解决方法(0)

.NET 4.0和C#4.0中的事件和委托逆转

在调查这个问题时,我很好奇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)

c# events delegates clr4.0 c#-4.0

28
推荐指数
2
解决办法
8461
查看次数

为什么C#4.0的协方差/逆变仅限于参数化接口和委托类型?

这是CLR的限制还是现有代码存在兼容性问题?

这与C#4.0中委托合并的混乱变化有关吗?

编辑:如果没有在CLR上运行的限制,是否可以使用使用共同/逆变的语言?

c# clr covariance contravariance c#-4.0

11
推荐指数
2
解决办法
618
查看次数

在C#多播委托中使用多播

何时通过单播代表进行多播委托是否有用?

我使用代理很多,主要是与C#lambdas结合使用,但我从未感觉到使用C#委托的多播方面的冲动,即我从来没有想过在一个委托中将多个委托组合在一起.因此,我很好奇多播代表在什么样的情况下是有用的 - 我只能想到你可以通过其他方式轻松实现功能的例子,比如链接代表或将它们放在列表中.

特别是,Eric Lippert 在这里给出的答案给人的印象是,即使C#团队有时会忘记代表的多播性.

.net c# delegates multicastdelegate

4
推荐指数
2
解决办法
3441
查看次数