C# 无法从';方法组';至';系统行动<;对象>';错误

C# 无法从';方法组';至';系统行动<;对象>';错误,c#,generics,delegates,method-group,C#,Generics,Delegates,Method Group,我创建了以下函数: public void DelegatedCall(Action<Object> delegatedMethod) 但是,当我尝试使用foo1调用DelegateCall时: DelegatedCall(foo1); …我得到以下编译器错误: 参数1:无法从“方法组”转换为“系统操作” 此错误的原因是什么?如何更正?不幸的是,将foo1转换为Action不是一个选项 方差不是这样工作的;你需要 DelegatedCall(obj => foo1((str

我创建了以下函数:

public void DelegatedCall(Action<Object> delegatedMethod)
但是,当我尝试使用
foo1
调用
DelegateCall
时:

DelegatedCall(foo1);
…我得到以下编译器错误:

参数1:无法从“方法组”转换为“系统操作”


此错误的原因是什么?如何更正?不幸的是,将
foo1
转换为
Action
不是一个选项

方差不是这样工作的;你需要

DelegatedCall(obj => foo1((string)obj));
即使在4.0中,它也不会相信每个对象都是字符串


请注意,如果它是
foo1(object)
Action
(即相反的方式),它可能会工作(在4.0中),因为每个字符串都是一个对象。

DelegatedCall
需要一个将任何
对象作为参数的委托。但是传递给
DelegatedCall
的函数
foo1
只能处理
字符串
参数。因此,转换不是类型安全的,因此是不可能的

输入参数为,但您的代码需要。(见附件。)

您可以将
DelegatedCall
设置为通用:

DelegatedCall<T>(Action<T> action)

但实现它是丑陋的,需要反思。它也不会验证函数在编译时是否只有一个参数。

另一种方法甚至在4.0之前也适用。当从方法组转换时,即使在早期版本中也可以使用差异。确定是否有其他方法,我可以做到这一点:我希望DelegateCall能够接收接收任何类型(字符串、布尔、列表…)的任何一个参数的函数。如果有任何帮助,我们将不胜感激。您知道我可以用什么方法创建这样的代码吗?我希望DelegateCall能够接收一个函数,该函数可以接收任何类型的任何一个参数(字符串、bool、List…),您可以在任何阅读材料上推荐如何使用反射来实现第二个选项吗?相关:
DelegatedCall<T>(Action<T> action)
DelegatedCall(Delegate action)