我正在尝试使用条件(三元)运算符将适当的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);
答案 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。表达式问题
编译器正在告诉您错误的原因 - '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 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));