2009-07-02 51 views
1

我想在内联if语句中写入lambda表达式。但是内联if语句必须具有强类型结果。如何编写强类型的lambda表达式?

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

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

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

+0

好了,我不知道你是什么将使用您保存的lambda(在本地使用它或将它传递给其他对象/方法)。如果你只在本地使用lambda,我想你应该可以用var关键字完成你的工作。 – 2009-07-02 21:16:49

+0

我改变了我的示例代码。事情是我必须使用带参数的构造函数,并设置其他属性。所以对象初始值设定不考虑。 – 2009-07-02 21:59:41

回答

6

即使有更复杂的代码,你可以使用一个对象初始化表达式:

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; 
}); 
6

这与lambda的打字没有任何关系。您试图返回null或(不带参数并返回MyType的函数),但是您要告诉编译器该语句的结果不是函数,而只是MyType。我想你想要做的是

MyType obj = someObj.IsOk ? null : new MyType(intVal); 
1

如果你有这样的事情......

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

你会得到错误...

“有null和lambda表达式之间没有明确的转换 。“

原因在这SO thread讨论。

马克是你想用什么样的代码示例做,除了你可以设置类似的财产,以及这样的正确的...

var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false }; 
相关问题