将参数化委托转换为非参数化模拟

时间:2016-06-29 05:21:29

标签: c# delegates

任何人都可以建议为什么我不能使用适当的类型参数将非泛型委托转换为泛型? 特别是有两名代表,如下所示

  1. public delegate void NotifyCollectionChangedEventHandler(object sender, NotifyCollectionChangedEventArgs e)
  2. public delegate void WeakEventHandler<TSource, TEvent>(TSource sender, TEvent e)
  3. 和委托变量

    1. NotifyCollectionChangedEventHandler handler;
    2. 我无法将处理程序转换为WeakEventHandler<object, NotifyCollectionChangedEventArgs>。有谁知道这是什么原因?

1 个答案:

答案 0 :(得分:2)

简单地说,他们是不同的类型。想象一下,你有两个这样的课程:

public class A1
{
    public int Value { get; set; }
}

public class A2
{
    public int Value { get; set; }
}

尽管看起来等同于,但他们仍然是不同的类 - 而且您无法在A1A2之间进行投射。与代表们的情况相同。

可以做的是包装现有的委托:

var weakHandler = new WeakEventHandler<object, NotifyCollectionChangedEventArgs>(handler);

创建一个新委托,在调用新委托时调用原始委托。