在使用C#进行编程的不同时间,我发现自己处于需要定义lambda(或匿名委托)并在同一行中调用它的情况.在这一点上,我能够做到这一点的"最干净"的方式是这样的:
bool foo_equals_bar = new Func<String, bool>(str => str.Equals("foo"))("bar");
Run Code Online (Sandbox Code Playgroud)
我希望能够写下以下内容:
bool foo_equals_bar = (str => str.Equals("foo"))("bar");
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不起作用.我会很高兴知道:
(str => str.Equals("foo"))这样返回的是什么,可用于初始化a Func<String, bool>,但不能像a一样进行求值Func<String, bool>?我应该指出我在C#3(VS2008)中工作,所以如果解决方案只存在于C#4中,请提及.(我仍然想知道,即使目前我无法获得解决方案).
谢谢
Kon*_*hin 14
您需要一组辅助方法来使编译器推断出lambda类型,例如:
public static class Functional
{
public static Func<TResult> Lambda<TResult>(Func<TResult> func)
{
return func;
}
public static Func<T, TResult> Lambda<T, TResult>(Func<T, TResult> func)
{
return func;
}
public static Func<T1, T2, TResult> Lambda<T1, T2, TResult>(Func<T1, T2, TResult> func)
{
return func;
}
}
现在你可以写:
bool foo_equals_bar = Functional.Lambda(str => str.Equals("foo"))("bar");
str => str == "A"
Run Code Online (Sandbox Code Playgroud)
是相同的
delegate (string str) { return str == "A";};
Run Code Online (Sandbox Code Playgroud)
所以不,没有办法只获得lambda,因为如果你刚才说,编译器不会知道str是什么类型
bool result = (str => str == "A")("B");
Run Code Online (Sandbox Code Playgroud)
编辑:
是的,您可以向lambda表达式添加类型,(string str) => str == "A"; 但仍然,由于某种原因它们不能隐式.不知道为什么.谢谢你的评论,Yuriy.
从(str => str.Equals("foo"))返回的内容可以用于初始化Func,但不能像Func一样进行求值?
只需使用内置类型,就有:
Expression<Func<string, bool>> a = str => str.Equals("foo");
Expression<Predicate<string>> b = str => str.Equals("foo");
Expression<Action<string>> c = str => str.Equals("foo");
Func<string, bool> a1 = str => str.Equals("foo");
Predicate<string> b1 = str => str.Equals("foo");
Action<string> c1 = str => str.Equals("foo");
Run Code Online (Sandbox Code Playgroud)
所有这些都是lambda表达式的有效解释.这就是我能想到的内置类型.还有任何与签名匹配的代表.
在C#编程中的不同时间,我发现自己想定义一个lambda(或匿名委托)并在同一行中调用它。
那是奇怪的情况。避免他们。这是不可能的,因为编译器无法推断类型。当您将匿名委托传递给编译器可以从中推断类型的某些方法时,这可能会起作用。
在任何情况下:
bool foo_equals_bar = "bar".Equals("foo");
Run Code Online (Sandbox Code Playgroud)
比*更具可读性:
bool foo_equals_bar = (str => str.Equals("foo"))("bar");
Run Code Online (Sandbox Code Playgroud)
*假设这样的语法是可能的
| 归档时间: |
|
| 查看次数: |
11458 次 |
| 最近记录: |