如何编写强类型的lambda表达式?

时间:2009-07-02 21:09:30

标签: c# lambda inline-if

我想在内联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语句中使用它?

3 个答案:

答案 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 };