我正在尝试在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,但这似乎阻止我使用方法组语法.
有任何想法吗?
(我的目标,fwiw,是能够引用具有不同返回类型和大量字符串参数的众多方法.我甚至不想打电话给它们 – 我只想反思它们的属性.我喜欢安全性然而,lambda只是键入方法名称字符串.)
编辑:澄清我想要使用Action的理由< string>:我的示例中的int可以是多种类型中的任何一种.我尝试模仿那种类型 –
void Set<T>(Func<Foo,Func<string,T>> a) { } void test() { Set(foo => foo.Hello); } // fails
– 但是编译器无法导出T(大概是出于同样的原因我不能在返回类型上重载?).
解决方法
当它具有非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,int>> a = foo => foo.Hello; }
这在VS2008和VS2010中都适用. C#4的方法组转换和类型推断已经发生了一些变化 – 不幸的是细节让我感到惊讶 – 但我不相信这种情况会受到这些变化的影响.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。