第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法為 C# 中的 EventArgs 分配使用派生類型的事件處理程序

無法為 C# 中的 EventArgs 分配使用派生類型的事件處理程序

C#
倚天杖 2022-12-24 14:17:23
所以我有一個事件聲明如下:public event EventHandler OnChangeDetected;然后我將以下處理程序分配給該事件。myObject.OnChangeDetected += OnTableChanged;我的理解是,此類事件需要我的 OnTableChanged 方法具有以下可以正常編譯的簽名。public void OnTableChanged(object sender, EventArgs e)現(xiàn)在我想將 OnTableChanged 事件替換為以下簽名。public void OnTableChanged(SqlChangeNotifier sender, SqlNotificationEventArgs e)但是,當我用派生類型替換參數(shù)時,它會抱怨沒有與委托 EventHandler 匹配的“OnTableChanged”重載。由于 SqlChangeNotifier 派生自 Object,而 SqlNotificationEventArgs 派生自 EventArgs,誰能解釋為什么我不能擁有這些派生參數(shù)類型,因為它們繼承自正確的基類型?
查看完整描述

3 回答

?
POPMUISE

TA貢獻1765條經(jīng)驗 獲得超5個贊

EventHandler是類型的委托void EventHandler(object sender, EventArgs e)。所以訂閱事件的處理程序的簽名必須與此匹配。

Nowvoid OnTableChanged(SqlChangeNotifier sender, SqlNotificationEventArgs e)比這更具體:它不能再接受任何 sender對象,并且事件參數(shù)也必須是 type SqlNotificationEventArgs

現(xiàn)在的問題是,當引發(fā)事件時,事件的原始發(fā)送者將嘗試使用參數(shù)調(diào)用事件處理程序,object sender, EventArgs e但您的方法需要更專業(yè)的類型。類型系統(tǒng)無法保證這些參數(shù)實際上是那些專用類型。

如果您需要這些類型,則需要將事件類型更改為限制性更強的委托類型。


查看完整回答
反對 回復(fù) 2022-12-24
?
墨色風雨

TA貢獻1853條經(jīng)驗 獲得超6個贊

有關(guān)此類更改的總體主題,請參閱逆變和協(xié)方差。


請記住,事件系統(tǒng)只是調(diào)用一系列方法的奇特方式,您可以在運行時換出這些方法,因此如果您不能使用與引發(fā)事件時傳遞的完全相同的參數(shù)直接調(diào)用處理程序,那么事件系統(tǒng)也做不到。


與方法一樣,事件處理程序是逆變的,這意味著類型的委托EventHandler<SpecializedEventArgs>(假設(shè)SpecializedEventArgs : EventArgs)將接受簽名處理程序,public void Handler(object sender, EventArgs args)因為對事件的調(diào)用最終會使用對象調(diào)用處理程序,該SpecializedEventArgs對象可以EventArgs通過簡單的多態(tài)性隱式轉(zhuǎn)換為。IE以下將編譯:


public static event EventHandler<SpecializedEventArgs> Event;

public static void Handler(object sender, EventArgs args) { }


public static void Main() {

    Event += Handler;

//...


查看完整回答
反對 回復(fù) 2022-12-24
?
Cats萌萌

TA貢獻1805條經(jīng)驗 獲得超9個贊

你不能那樣做,因為事件的訂閱者應(yīng)該得到一個派生實例,但發(fā)布者只能提供一個基礎(chǔ)實例。


你可以做相反的事情:


public static event KeyEventHandler ChangeDetected; // handler with derived args signature


private static void Program_ChangeDetected(object sender, EventArgs e) // base event args are OK

{

    Console.WriteLine("ChangeDetected");

}


static void Main(string[] args)

{

    ChangeDetected += Program_ChangeDetected;

    ChangeDetected?.Invoke(null, new KeyEventArgs(default)); // base event args are NOT OK

}


查看完整回答
反對 回復(fù) 2022-12-24
  • 3 回答
  • 0 關(guān)注
  • 106 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號