gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:24:31 24 4
gpt4 key购买 nike

我正在尝试在 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;
}

当我更改 Hello 的返回类型时至 int , 然而, 我得到

'Bar.Hello(string)' has the wrong return type.

我试过 Func代替 Action ,但这似乎阻止了我使用方法组语法。

有什么想法吗?

(首先,我的目标是能够引用许多具有不同返回类型和大量字符串参数的方法。我什至不打算调用它们 - 我只是想反射(reflect)它们的属性。我确实然而,就像 lambda 的安全性,而不是仅仅输入方法名称字符串。)


编辑:阐明我想使用 Action<string> 的原因: int在我的示例中,可能是多种类型中的任何一种。我试过模板化那种类型——

void Set<T>(Func<Foo, Func<string, T>> a) { }
void Test() { Set(foo => foo.Hello); } // fails

-- 但编译器无法导出 T (大概出于同样的原因我不能重载返回类型?)。

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

最佳答案

当它具有非 void 返回类型时,它不再与 Action<string> 兼容。 .换句话说,这也会失败:

int Foo(string s) { return 10; }

// Error: wrong return type
Action<string> action = new Action<string>(Foo);

关于为什么不允许这样做的原因,请参阅 Eric Lippert 在 "The void is invariant" 上的博客文章.

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

public class Foo { public int Hello(string s) { return 10; } }

void Test()
{
Func<Foo, Func<string, int>> a = foo => foo.Hello;
}

这对我在 VS2008 和 VS2010 中都有效。 C# 4 的方法组转换和类型推断发生了一些变化——不幸的是细节让我忘记了——但我认为这种情况不会受到这些变化的影响。

关于c# - 为什么添加返回类型会阻止我使用方法组语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com