2

我想在内联 if 语句中编写一个 lambda 表达式。但内联 if 语句必须有强类型结果。

MyType obj = someObj.IsOk ? null : () => {
   MyType o = new MyType(intVal);
   o.PropertyName = false;
   return o;
};

当然这不起作用,因为 lambda 表达式不是强类型的。我想过使用Func<intVal, MyType>委托,使其成为强类型。

但是我如何Func<>在 inline if 中使用它?我是否有可能必须在外部定义自己的函数并在内联 if 语句中使用它?

4

3 回答 3

7

它与 lambda 在这里的输入无关。您试图返回nullor(一个不带参数并返回 MyType 的函数),但您告诉编译器该语句的结果不是函数,而只是 MyType。我想你想做的是

MyType obj = someObj.IsOk ? null : new MyType(intVal);
于 2009-07-02T21:18:45.923 回答
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;
});
于 2009-07-02T22:07:39.680 回答
2

如果你有这样的...

  var obj = (someObj.IsOK) ? null : () => {
             return new MyType(intVal) { PropName =false }; }

你会得到错误...

“null 和 lambda 表达式之间没有显式转换。”

其原因在此SO 线程中进行了讨论。

马克对您尝试对代码示例执行的操作是正确的,除了您可以像这样设置属性...

var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
于 2009-07-02T22:09:19.473 回答