Search code examples
c#genericsdelegatesmethod-group

Cannot convert from 'method group' to 'System.Action<object>' error


I have created the following function:

public void DelegatedCall(Action<Object> delegatedMethod)

And defined the following method

public void foo1(String str) { }

However, when I try to call DelegateCall with foo1:

DelegatedCall(foo1);

...I get the following compiler error:

Argument 1: cannot convert from 'method group' to 'System.Action<object>'

What is the reason for this error and how can I correct it? Unfortunately, casting foo1 to Action is not an option.


Solution

  • DelegatedCall expects a delegate that takes any object as an argument. But your function foo1 that you are passing to DelegatedCall can only cope with a string argument. So, the conversion isn't type-safe and thus is not possible.

    Input parameters are contra-variant, but your code needs covariance. (See Difference between Covariance & Contra-variance.)

    You can make DelegatedCall generic:

    DelegatedCall<T>(Action<T> action)
    

    ...or have it take any delegate:

    DelegatedCall(Delegate action)
    

    But then implementing it is ugly and requires reflection. It also doesn't verify that the function has only one parameter at compile-time.