我想在内联if语句中编写lambda表达式。但内联if语句必须具有强类型结果。
MyType obj = someObj.IsOk ? null : () => {
MyType o = new MyType(intVal);
o.PropertyName = false;
return o;
};
当然这不起作用,因为lambda表达式不是强类型的。我想过使用Func<intVal, MyType>
委托来强化它。
但如何在内联中使用此Func<>
if?我是否必须在外部定义自己的函数并在内联if语句中使用它?
答案 0 :(得分:7)
这与lambda在这里打字无关。您正在尝试返回null
或(不带参数的函数并返回MyType)但您告诉编译器该语句的结果不是函数,而只是MyType。我想你想做的是
MyType obj = someObj.IsOk ? null : new MyType(intVal);
答案 1 :(得分:7)
即使代码更复杂,也可以使用对象初始化表达式:
MyType obj = someObj.IsOk ? null : new MyType(intVal) { ProName = false };
如果确实想要使用lambda,你可以写:
MyType obj = someObj.IsOk ? null : ((Func<MyType>) (() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
}))();
然而,坦率地说,这是一个括号和演员的噩梦。您可以使用辅助方法使其更简单:
public T Execute(Func<T> func)
{
return func();
}
...
MyType obj = someObj.IsOk ? null : Execute(() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
});
答案 2 :(得分:2)
如果你有类似的东西......
var obj = (someObj.IsOK) ? null : () => {
return new MyType(intVal) { PropName =false }; }
您将收到错误...
“没有明确的转换 在null和lambda表达式之间。“
在SO thread中讨论了这个原因。
Mark对于您要对代码示例执行的操作是正确的,除了您可以像这样设置属性...
var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };