繁体   English   中英

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

[英]How to write strongly typed lambda expressions?

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

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

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

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

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

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

即使使用更复杂的代码,也可以使用对象初始化器表达式:

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

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

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

您将收到错误信息...

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

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

Mark可以正确处理您的代码示例,但您可以像这样设置属性...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM