使用条件(三元)运算符分配lambda表达式

时间:2012-07-03 11:02:33

标签: c# lambda

我正在尝试使用条件(三元)运算符将适当的lambda表达式分配给变量,具体取决于条件,但是我得到编译器错误:条件表达式的类型无法确定,因为没有'lambda expression'和'lambda expression'之间的隐式转换。我可以使用常规的if-else来解决这个问题,但是条件运算符对我来说更有意义(在这个上下文中),会使代码更简洁添加,至少,我想知道它为什么没有的原因'工作。

// this code compiles, but is ugly! :)
Action<int> hh;
if (1 == 2) hh = (int n) => Console.WriteLine("nope {0}", n);
else hh = (int n) => Console.WriteLine("nun {0}", n);

// this does not compile
Action<int> ff = (1 == 2)
  ? (int n) => Console.WriteLine("nope {0}", n)
  : (int n) => Console.WriteLine("nun {0}", n);

4 个答案:

答案 0 :(得分:21)

C#编译器尝试独立创建lambda,并且无法明确地确定类型。转换可以通知编译器使用哪种类型:

Action<int> ff = (1 == 2)
  ? (Action<int>)((int n) => Console.WriteLine("nope {0}", n))
  : (Action<int>)((int n) => Console.WriteLine("nun {0}", n));

答案 1 :(得分:16)

这样可行。

Action<int> ff = (1 == 2)
? (Action<int>)((int n) => Console.WriteLine("nope {0}", n))
: (Action<int>)((int n) => Console.WriteLine("nun {0}", n)); 

这里有两个问题

  1. 表达
  2. 三元运营商
  3. <强> 1。表达式问题

    编译器正在告诉您错误的原因 - 'Type of conditional expression cannot be determined because there is no implicit conversion between 'lambda expression' and 'lambda expression'

    这意味着你所写的是lambda表达式,结果变量也是lambda表达式。

    lambda表达式没有任何特定类型 - 它只能转换为表达式树。

    成员访问表达式(您正在尝试做的事情)仅在表单中可用

    primary-expression . identifier type-argument-list(opt)
    predefined-type . identifier type-argument-list(opt)
    qualified-alias-member . identifier type-argument-list(opt)
    

    ...并且lambda表达式不是主要表达式。

    <强> 2。三元算子的问题

    如果我们这样做

    bool? br = (1 == 2) ? true: null;
    

    这导致错误的说法与您的完全相同。 'Type of conditional expression cannot be determined because there is no implicit conversion between 'bool' and '<null>'

    但如果我们这样做,错误就消失了

    bool? br = (1 == 2) ? (bool?)true: (bool?)null;
    

    一方的施法也会起作用

    bool? br = (1 == 2) ? (bool?)true: null;
    

    OR

    bool? br = (1 == 2) ? true: (bool?)null;
    

    对于你的情况

    Action<int> ff = (1 == 2)
    ? (Action<int>)((int n) => Console.WriteLine("nope {0}", n))
    : ((int n) => Console.WriteLine("nun {0}", n)); 
    

    OR

    Action<int> ff = (1 == 2)
    ? ((int n) => Console.WriteLine("nope {0}", n))
    : (Action<int>)((int n) => Console.WriteLine("nun {0}", n)); 
    

答案 2 :(得分:5)

事实上,通过类型推断,您可以:

  • 将var用于本地变量
  • 仅转换三元运算符的第一个表达式
  • 省略lambda参数的类型,因为可以推断它

结果更加简洁。 (我让你决定它是否更具可读性。)

    var ff = condition 
             ? (Action<int>)(n => Console.WriteLine("nope {0}", n)) 
             : n => Console.WriteLine("nun {0}", n);

答案 3 :(得分:4)

基本上与其他人一样,以不同的形式

Action<int> ff = (1 == 2) 
? new Action<int>(n => Console.WriteLine("nope {0}", n)) 
: new Action<int>(n => Console.WriteLine("nun {0}", n));