相关疑难解决方法(0)

在C#事件处理程序中,为什么"sender"参数必须是一个对象?

根据Microsoft事件命名准则,senderC#事件处理程序中的参数" 始终是类型对象,即使可以使用更具体的类型".

这导致了许多事件处理代码,如:

RepeaterItem item = sender as RepeaterItem;
if (item != null) { /* Do some stuff */ }
Run Code Online (Sandbox Code Playgroud)

为什么约定建议不要使用更具体的类型声明事件处理程序?

MyType
{
    public event MyEventHander MyEvent;
}

...

delegate void MyEventHander(MyType sender, MyEventArgs e);
Run Code Online (Sandbox Code Playgroud)

我错过了一个陷阱吗?

对于后人:我同意的答案一般情绪的惯例使用对象(并通过传递数据EventArgs),即使它是可以使用更具体的类型,而在现实世界编程它按照重要大会.

c# events

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

.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
查看次数

Action <object,EventArgs>无法转换为EventHandler?

我正在连接一个事件以使用一个lambda,它需要在触发后自行移除.我无法通过将lambda内联到+ =事件(没有用于删除事件的可访问变量)来做到这一点,所以我设置了一个Action<object, EventArgs>变量并将lambda移动到那里.主要错误是它无法将其转换Action<object, EventArgs>为EventHandler.我认为lambda表达式可以隐式转换为事件处理程序,为什么这不起作用?

.net c# casting event-handling

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

标签 统计

c# ×3

events ×2

.net ×1

c#-4.0 ×1

casting ×1

clr4.0 ×1

delegates ×1

event-handling ×1