lad*_*dge 3 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;
}
Run Code Online (Sandbox Code Playgroud)
当我改变的返回类型Hello
来int
,不过,我得到
'Bar.Hello(string)'的返回类型错误.
我试过用Func
它代替Action
,但这似乎阻止我使用方法组语法.
有任何想法吗?
(我的目标,fwiw,是能够引用具有不同返回类型和大量字符串参数的众多方法.我甚至不想打电话给它们 - 我只想反思它们的属性.我喜欢安全性然而,lambda只是键入方法名称字符串.)
编辑:澄清我想要使用的原因Action<string>
:int
在我的例子中可能是多种类型中的任何一种.我尝试模仿那种类型 -
void Set<T>(Func<Foo, Func<string, T>> a) { }
void Test() { Set(foo => foo.Hello); } // fails
Run Code Online (Sandbox Code Playgroud)
- 但是编译器无法派生T
(大概是出于同样的原因我不能在返回类型上重载?).
还有其他想法吗?只要我能让编译器检查该方法组的名称,我就不会在这种情况下反对一些疯狂的反思.
当它具有非void返回类型时,它不再兼容Action<string>
.换句话说,这也会失败:
int Foo(string s) { return 10; }
// Error: wrong return type
Action<string> action = new Action<string>(Foo);
Run Code Online (Sandbox Code Playgroud)
对于原因,为什么这是不允许的,看到埃里克利珀的博客文章"空隙是不变的".
您应该能够使用方法组语法,如下所示:
public class Foo { public int Hello(string s) { return 10; } }
void Test()
{
Func<Foo, Func<string, int>> a = foo => foo.Hello;
}
Run Code Online (Sandbox Code Playgroud)
这在VS2008和VS2010中都适用.C#4的方法组转换和类型推断已经发生了一些变化 - 不幸的是细节让我感到惊讶 - 但我不相信这种情况会受到这些变化的影响.
使用void返回类型,foo.Hello是一个Action<string>
.使用int返回类型,它现在是一个Func<string, int>
.
要处理多个返回类型 - 并假设您不需要对返回值执行任何操作 - 您可以通过以下方式简单地包装非void函数:
Func<Foo, Action<string>> a = foo => s => foo.Hello(s);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1419 次 |
最近记录: |