2 回答

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個贊
至于可能的解決方案,您可以使用特定類型的引用來添加兩個處理程序,并且由于協(xié)方差,它可以正常工作:
impObj.doSomethingWithT += DoSomethingSpecific; impObj.doSomethingWithT += DoSomething;
至于原因,我只能提供一個有根據(jù)的猜測:運(yùn)行時不允許將具有不同類型參數(shù)的處理程序附加到具有泛型類型的委托,即使協(xié)方差規(guī)則對于編譯器而言是有效的。泛型類型 ( System.Action<T>
) 的委托正是您在使用genericObj
引用時所訪問的對象,即使它在創(chuàng)建 時已使用具體參數(shù)類型進(jìn)行了初始化impObj
。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個贊
我仍然沒有找到為什么會發(fā)生這種情況的解釋,但我確實(shí)找到了一種解決方法,可以讓您做到這一點(diǎn)。您必須實(shí)現(xiàn)事件的訪問器并將委托保存在單獨(dú)的列表或哈希集中,而不是使用內(nèi)置事件實(shí)現(xiàn)。
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 的多個基本類型的委托。當(dāng)然,缺點(diǎn)是您必須為每個實(shí)現(xiàn)該接口的類執(zhí)行此操作,但它保證每當(dāng)您使用這些類的事件時,無論 T 如何,它都會起作用并且不會引發(fā)異常。
- 2 回答
- 0 關(guān)注
- 215 瀏覽
添加回答
舉報