3

I'm doing something like this:

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); };

}

Why can I add a handler with different type immediately, but I can't use reference to a method?

marbel82
  • 925
  • 1
  • 18
  • 39
  • 1
    Read [this](https://msdn.microsoft.com/en-us/library/mt654057.aspx). – Maarten Sep 21 '16 at 10:01
  • What is the error and what did your research show? http://stackoverflow.com/questions/28522523/cannot-implicitly-convert-type-system-eventhandler-to-system-eventhandlerobject – CodeCaster Sep 21 '16 at 10:12

2 Answers2

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

Because the compiler automatically converts the method group komar_EventHandler to a PropertyChangedEventHandler delegate. It's the same as if your code was:

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

The PropertyChanged event expects a PropertyChangedEventHandler, not an EventHandler. There's no implicit conversion between different delegate types.

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

An EventHandler can't be cast to a PropertyChangedEventHandler; it's just not a valid conversion. You can, however, create a PropertyChangedEventHandler from a EventHandler:

k.PropertyChanged += new PropertyChangedEventHandler(methodRef);
Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
1

Thomas Levesque you've got a point. I forgot about this:

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

But the solution my question is, however, other.

Compiler need a method, so the solution is:

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

Edit:
We can do it also this way:

k.PropertyChanged += new PropertyChangedEventHandler(methodRef);
// Debugger showed me that k.PropertyChanged has reference
// to the method methodRef.Invoke same as k.PropertyChanged += methodRef.Invoke;  
Community
  • 1
  • 1
marbel82
  • 925
  • 1
  • 18
  • 39