最近在做Office方面的開發工作,在操作Word時發現一處“二義性”的警告:
分析了一下,原因比較簡單,先看下圖:
Application繼承了兩個接口,兩個接口中都有一個名為“Quit”的成員:
new Application() 返回的是類 ApplicationClass 的實例,ApplicationClass實現了以上接口:
ApplicationEvents4.Quit事件實現的比較奇特(上圖258行),它的名字變成了ApplicationEvents4_Event。大概因為ApplicationClass類中已經有了一個名稱為Quit的方法(上圖片953行),出現了名稱沖突,所以要避讓一下(但不知道為什麼要采用這種方式)。DocumentBeforeClose事件因為不存在重名的成員,其名稱則與接口中定義保持一致。
雖然經過了這樣的處理,但ApplicationEvents4_Event.Quit並非顯式接口實現,於是出現了兩個“同名”成員:一個方法、一個事件(非方法)。在編譯時必須確定一個,可能方法的優先級高於事件,於是編譯器“將使用方法組”。
以上是我的大膽推測,不知道是否合理,還請高手指點。
注意:按F6編譯後這個警告會消失,項目重新生成後又會出現。
隨便提一下,c#中是不允許出現同名成員的(方法重載除外),如以下代碼是無法編譯通過的:
這種情況下,必須顯示實現接口。