是否可以在lambda表达式中进行切换?如果没有,为什么? Resharper将其显示为错误。
您可以在语句中阻止lambda:
Action<int> action = x =>
{
switch(x)
{
case 0: Console.WriteLine("0"); break;
default: Console.WriteLine("Not 0"); break;
}
};
但是您不能在“单个表达式lambda”中执行此操作,因此这是无效的:
// This won't work
Expression<Func<int, int>> action = x =>
switch(x)
{
case 0: return 0;
default: return x + 1;
};
这意味着您不能在表达式树中使用switch(至少是由C#编译器生成的;我相信.NET 4.0至少在库中支持它)。
在纯Expression
中(在.NET 3.5中,最接近的是复合条件:
Expression<Func<int, string>> func = x =>
x == 1 ? "abc" : (
x == 2 ? "def" : (
x == 3 ? "ghi" :
"jkl")); /// yes, this is ugly as sin...
不好玩,尤其是当它变得复杂时。如果您是指带有语句主体的lamda表达式(仅用于LINQ-to-Objects),则括号内的所有内容均合法:
Func<int, string> func = x => {
switch (x){
case 1: return "abc";
case 2: return "def";
case 3: return "ghi";
default: return "jkl";
}
};
当然,您可以将工作外包;例如,LINQ-to-SQL允许您将标量UDF(在数据库中)映射到数据上下文中的方法(实际上并没有使用)-例如:
var qry = from cust in ctx.Customers
select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) };
其中MapType
是在数据库服务器上完成工作的UDF。
是的,它可以工作,但是您必须将代码放在一个块中。示例:
private bool DoSomething(Func<string, bool> callback)
{
return callback("FOO");
}
然后,称之为:
DoSomething(val =>
{
switch (val)
{
case "Foo":
return true;
default:
return false;
}
});
嗯,我认为没有理由不起作用。请小心使用的语法
param => {
// Nearly any code!
}
delegate (param) {
// Nearly any code!
}
param => JustASingleExpression (No switches)
我也检查过它:-)
[Test]
public void SwitchInLambda()
{
TakeALambda(i => {
switch (i)
{
case 2:
return "Smurf";
default:
return "Gnurf";
}
});
}
public void TakeALambda(Func<int, string> func)
{
System.Diagnostics.Debug.WriteLine(func(2));
}
效果很好(输出“ Smurf”)!