这很好用:
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);
答案 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(大写)。