我创建了以下功能:
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
不是一种选择。
答案 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>