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.
Variance doesn't work that way around; you would need
As even in 4.0 it won't believe that every object is a string.
Note that if it was
foo1(object)
andAction<string>
(i.e. the other way around) it probably would work (in 4.0), since every string is an object.DelegatedCall
expects a delegate that takes anyobject
as an argument. But your functionfoo1
that you are passing toDelegatedCall
can only cope with astring
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:...or have it take any delegate:
But then implementing it is ugly and requires reflection. It also doesn't verify that the function has only one parameter at compile-time.