2016-09-21 65 views
3

我做這樣的事情的處理程序添加到的PropertyChanged與事件處理程序的屬性類型:爲什麼我不能(參照法)

void komar_EventHandler(object sender, EventArgs e) 
{ 
    // Do somethig 
} 

... 
{ 
    Komar k = new Komar(); 

    k.PropertyChanged += komar_EventHandler; // OK (why?) 


    EventHandler methodRef = komar_EventHandler; 

    k.PropertyChanged += methodRef;        // Error ! 
    k.PropertyChanged += (PropertyChangedEventHandler)methodRef; // Error ! 


    // I know solution, but I don't like it :) 
    k.PropertyChanged += (s, e) => { methodRef(s, e); }; 

} 

爲什麼我可以馬上添加不同類型的處理程序,但我不能使用引用方法?

+1

閱讀[這](https://開頭msdn.microsoft.com/en-us/library/mt654057.aspx)。 – Maarten

+0

什麼是錯誤,你的研究顯示了什麼? http://stackoverflow.com/questions/28522523/cannot-implicitly-convert-type-system-eventhandler-to-system-eventhandlerobject – CodeCaster

回答

2
k.PropertyChanged += komar_EventHandler; // OK (why?) 

由於編譯器的方法組komar_EventHandler自動轉換爲PropertyChangedEventHandler委託。這是一樣的,如果你的代碼是:

k.PropertyChanged += new PropertyChangedEventHandler(komar_EventHandler); 
k.PropertyChanged += methodRef;        // Error ! 

PropertyChanged事件需要一個PropertyChangedEventHandler,不是EventHandler。不同委託類型之間沒有隱式轉換。

k.PropertyChanged += (PropertyChangedEventHandler)methodRef; // Error ! 

EventHandler不能轉換到一PropertyChangedEventHandler;它只是不是一個有效的轉換。你可以,但是,創建一個PropertyChangedEventHandlerEventHandler

k.PropertyChanged += new PropertyChangedEventHandler(methodRef); 
+0

不錯的答案,但我會評論OP不喜歡的解決方案(與拉姆達) – Fabjan

0

Thomas Levesque你說得挺有道理的。我忘了這個:

k.PropertyChanged += komar_EventHandler; // OK (why?) 
// because: 
k.PropertyChanged += new PropertyChangedEventHandler(komar_EventHandler); 

但是,我的問題的解決方案是,但其他。

編譯器需要一種方法,因此該解決方案是:

k.PropertyChanged += methodRef.Invoke;        // OK ! 
k.PropertyChanged += (PropertyChangedEventHandler)methodRef.Invoke; // OK ! 

編輯:
我們可以做到這一點也這樣說:

k.PropertyChanged += new PropertyChangedEventHandler(methodRef); 
// Debugger showed me that k.PropertyChanged has reference 
// to the method methodRef.Invoke same as k.PropertyChanged += methodRef.Invoke; 
+0

是的,'methodRef.Invoke'也可以工作,因爲它是一個兼容簽名的方法 –

+0

@ThomasLevesque哦,我剛剛看到你寫完我的答案之前已經完成了答案。所以...你應該贏得:) – marbel82