无法从'方法组'转换为'System.Action <object>'错误</object>

时间:2011-01-16 09:55:31

标签: c# generics delegates method-group

我创建了以下功能:

public void DelegatedCall(Action<Object> delegatedMethod)

并定义了以下方法

public void foo1(String str) { }

但是,当我尝试使用DelegateCall

致电foo1
DelegatedCall(foo1);

...我收到以下编译错误:

  

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

出现此错误的原因是什么?如何更正错误?很遗憾,将foo1投射到Action不是一种选择。

2 个答案:

答案 0 :(得分:28)

DelegatedCall期望一个以object为参数的委托。但是,您传递给foo1的函数DelegatedCall只能处理string参数。因此,转换不是类型安全的,因此是不可能的。

输入参数为 contra-variant ,但您的代码需要 covariance 。 (见Difference between Covariance & Contra-variance。)

您可以DelegatedCall通用:

DelegatedCall<T>(Action<T> action)

......或者接受任何代表:

DelegatedCall(Delegate action)

然后实施它是丑陋的,需要反思。它也不验证函数在编译时只有一个参数。

答案 1 :(得分:10)

方差并非如此;你需要

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

即使在4.0中,也不会相信每个对象都是字符串。

请注意,如果它是foo1(object)Action<string>(即相反),它可能会起作用(在4.0中),因为每个字符串都是一个对象。 / p>