为什么参数'Delegate'只接受RoutedEventHandler委托?

时间:2013-12-13 15:10:51

标签: c# delegates action

这很好用:

EventManager.RegisterClassHandler(typeof(DataGrid),    
      DataGrid.SelectionChangedEvent,    
      new RoutedEventHandler(ScrollToSelectedItem));

void ScrollToSelectedItem(object sender, RoutedEventArgs e)

这会编译但在运行时会给出异常:处理程序类型不匹配

EventManager.RegisterClassHandler(typeof(DataGrid),    
         DataGrid.SelectionChangedEvent,       
         new Action<object, RoutedEventArgs>(    
         (object sender, RoutedEventArgs e1) =>    
         ScrollToSelectedItem(sender, e1, false)));

  void ScrollToSelectedItem(object sender, RoutedEventArgs e, bool jump)

RegisterClassHandler的第三个参数声明为Delegate handler

隐含地假设处理程序不仅是委托而是RoutedEventHandler委托吗? 那么为什么RegisterClassHandler没有更准确的签名?

EDIT 刚发现我可以通过以下方式解决这个问题:

RoutedEventHandler htrue = (o, ea) => ScrollToSelectedItem(o, ea, true);
RoutedEventHandler hfalse = (o, ea) => ScrollToSelectedItem(o, ea, false);
void ScrollToSelectedItem(object sender, RoutedEventArgs e, bool jump)
EventManager.RegisterClassHandler(typeof(DataGrid),     
        DataGrid.SelectionChangedEvent, hfalse);

2 个答案:

答案 0 :(得分:2)

仅仅因为两个不同的代表具有相同的签名并不会使它们相同,原因与以下两种类型不同:

public class Foo { public int n; }
public class Bar { public int n; }

您无法将Foo分配给Bar,因为它们具有相同的实例字段。

Action是一种类型,就像RoutedEventHandler一样,它们之间没有隐式转换。

  

那么为什么RegisterClassHandler不是更准确的签名?

至于为什么它没有更明确的签名,我不能说,我没有设计这个类。考虑到你的困惑,它确实听起来不是很好。可能 应该有一个特定的委托作为必需的参数。

答案 1 :(得分:0)

Delegate(大写)是一个类。 delegate(小写)是一种类型。

动作&LT;&GT;返回一个委托(小写),就我所知,它不会强制转换为Delegate(大写)。