2 回答
TA贡献1813条经验 获得超2个赞
至于可能的解决方案,您可以使用特定类型的引用来添加两个处理程序,并且由于协方差,它可以正常工作:
impObj.doSomethingWithT += DoSomethingSpecific; impObj.doSomethingWithT += DoSomething;
至于原因,我只能提供一个有根据的猜测:运行时不允许将具有不同类型参数的处理程序附加到具有泛型类型的委托,即使协方差规则对于编译器而言是有效的。泛型类型 ( System.Action<T>
) 的委托正是您在使用genericObj
引用时所访问的对象,即使它在创建 时已使用具体参数类型进行了初始化impObj
。
TA贡献1824条经验 获得超5个赞
我仍然没有找到为什么会发生这种情况的解释,但我确实找到了一种解决方法,可以让您做到这一点。您必须实现事件的访问器并将委托保存在单独的列表或哈希集中,而不是使用内置事件实现。
public class ImpClass: SpecificInterface { // An implementation of the more specific interface
public event System.Action<SomeClass> doSomethingWithT {
add { delegateSubs.Add(value); }
remove { delegateSubs.Remove(value); }
}
protected HashSet<System.Action<SomeClass>> delegateSubs = new HashSet<System.Action<SomeClass>>();
}
这样您就可以毫无问题地添加/删除 T 的多个基本类型的委托。当然,缺点是您必须为每个实现该接口的类执行此操作,但它保证每当您使用这些类的事件时,无论 T 如何,它都会起作用并且不会引发异常。
- 2 回答
- 0 关注
- 134 浏览
添加回答
举报