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

匿名 (未验证) 提交于 2019-12-03 08:33:39

问题:

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.

回答1:

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.



回答2:

Variance doesn't work that way around; you would need

DelegatedCall(obj => foo1((string)obj)); 

As even in 4.0 it won't believe that every object is a string.

Note that if it was foo1(object) and Action<string> (i.e. the other way around) it probably would work (in 4.0), since every string is an object.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!