C# 为什么添加返回类型会阻止我使用方法组语法?

C# 为什么添加返回类型会阻止我使用方法组语法?,c#,lambda,method-group,C#,Lambda,Method Group,我尝试在lambda表达式中使用方法组,如下所示: public class Foo { public void Hello(string s) { } } void Test() { // this works as long as Hello has a void return type Func<Foo, Action<string>> a = foo => foo.Hello; } public class Foo { public in

我尝试在lambda表达式中使用方法组,如下所示:

public class Foo { public void Hello(string s) { } }

void Test()
{
    // this works as long as Hello has a void return type
    Func<Foo, Action<string>> a = foo => foo.Hello;
}
public class Foo { public int Hello(string s) { return 10; } }

void Test()
{
    Func<Foo, Func<string, int>> a = foo => foo.Hello;
}
--但是编译器不能派生
t
(大概是出于同样的原因,我不能重载返回类型?)


还有其他想法吗?在这种情况下,我并不反对某些疯狂的反射,只要我能让编译器检查该方法组的名称。

当它具有非void返回类型时,它就不再与
操作兼容。换句话说,这也会失败:

int Foo(string s) { return 10; }

// Error: wrong return type
Action<string> action = new Action<string>(Foo);
intfoo(字符串s){return 10;}
//错误:返回类型错误
动作动作=新动作(Foo);
关于不允许这样做的原因,请参阅Eric Lippert的博客文章

您应该能够像这样使用方法组语法:

public class Foo { public void Hello(string s) { } }

void Test()
{
    // this works as long as Hello has a void return type
    Func<Foo, Action<string>> a = foo => foo.Hello;
}
public class Foo { public int Hello(string s) { return 10; } }

void Test()
{
    Func<Foo, Func<string, int>> a = foo => foo.Hello;
}
public类Foo{public int Hello(string s){return 10;}
无效测试()
{
Func a=foo=>foo.Hello;
}

这在VS2008和VS2010中都适用。C#4的方法组转换和类型推断发生了一些变化-不幸的是,我没有注意到细节-但我不相信这种情况会受到这些变化的影响。

使用void返回类型foo。Hello是一个
操作。对于int返回类型,它现在是
Func

要处理多个返回类型,并且假设您不需要对返回值执行任何操作,您可以简单地包装非void函数,如下所示:

Func<Foo, Action<string>> a = foo => s => foo.Hello(s);
Func a=foo=>s=>foo.Hello(s);

有趣的博客文章。不幸的是,在我的示例中,我希望存在于右侧的值的返回类型各不相同。我更新了我的文章,提供了更多的信息。读者可能还对另一篇相关的Lippert博客文章感兴趣。谢谢你的回答-不幸的是,我在实际程序中尝试“分组”的方法都是不同的返回类型。我用更多的信息更新了我的帖子。@ladenedge:我已经修改了我的答案(希望)来回应你的评论。我大体上喜欢这个想法,但问题是我失去了方法组语法!(或者至少,如果不显式地传递
s
,我似乎无法让它编译)正如我上面提到的,我不仅有一堆返回类型,而且还有一堆字符串参数-我真的希望避免将它们机械地传递到
Hello
的每个外观中。