代码之家  ›  专栏  ›  技术社区  ›  StuartLC

如何使用条件三元运算符分配Func<>?[副本]

  •  6
  • StuartLC  · 技术社区  · 10 年前

    使现代化

    在C#10中,此语法现在有效,编译器将推断lambda的“自然类型” Example here

    C#9及更早版本

    我知道 Func<> 不能直接通过 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分支任务?

    4 回复  |  直到 3 年前
        1
  •  14
  •   Lee    10 年前
    var filter = (someBooleanExpressionHere)
       ? new Func<Something, bool>(x => x.SomeProp < 5)
       : x => x.SomeProp >= 5;
    
        2
  •  3
  •   Patrick Hofman    10 年前

    你应该用一个 new Func 因为否则它不能将一个lamdba转换为另一个:

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

    如果删除 new Func... 您将获得:

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

        3
  •  1
  •   Patrick Hofman    10 年前

    您可以明确地将该类型作为编译器的提示

    var filter = (condition)
        ? (Func<Something, bool>)(x => x.SomeProp < 5)
       : x => x.SomeProp >= 5;
    
        4
  •  1
  •   Moss    8 年前

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

    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;