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 關注
- 200 瀏覽
添加回答
舉報