如何分配Func<>;使用条件三元运算符

本文关键字:条件 运算符 三元 lt 何分配 分配 Func gt | 更新日期: 2023-09-27 18:20:35

更新

在C#10中,这种语法现在是有效的,编译器将推断lambda的"自然类型"。示例如下

C#9及更早版本

我知道Func<> s不能通过var关键字直接隐式键入,尽管我希望我可以完成以下谓词赋值:

Func<Something, bool> filter = (someBooleanExpressionHere)
   ? x => x.SomeProp < 5
   : x => x.SomeProp >= 5;

然而,我得到错误cannot resolve the symbol, 'SomeProp'

目前,我采用了更繁琐的if branch任务,它看起来并不那么优雅。

Func<Something, bool> filter;
if (someBooleanExpressionHere)
{
    filter = x => x.SomeProp < 5;
}
else
{
    filter = x => x.SomeProp >= 5;
}

我是不是遗漏了什么,还是需要继续执行if分支的任务?

如何分配Func<>;使用条件三元运算符

var filter = (someBooleanExpressionHere)
   ? new Func<Something, bool>(x => x.SomeProp < 5)
   : x => x.SomeProp >= 5;

您应该将它们封装在new Func中,因为否则它无法将一个lamdba转换为另一个:

 Func<Something, bool> filter = (someBooleanExpressionHere)
   ? new Func<Something, bool>(x => x.SomeProp < 5)
   : x => x.SomeProp >= 5
   ;

如果您移除new Func...,您将获得:

无法确定条件表达式的类型,因为"lambda expression"answers"lambda表达式"之间没有隐式转换

您可以显式地提到类型作为编译器的提示

var filter = (condition)
    ? (Func<Something, bool>)(x => x.SomeProp < 5)
   : x => x.SomeProp >= 5;

如果合适,可以将这些选择器分配给静态字段。

private static readonly Func<Something, bool> _someFilter = x => x.SomeProp < 5;
private static readonly Func<Something, bool> _someOtherFilter = x => x.SomeProp >= 5;

然后您可以稍后使用它们。

var filter = (someBooleanExpressionHere) ? _someFilter : _someOtherFilter;