【问题标题】:How to write strongly typed lambda expressions?如何编写强类型的 lambda 表达式?
【发布时间】:2010-11-07 18:46:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 好吧,我不知道你会用你保存的 lambda 做什么(在本地使用它或将它传递给其他对象/方法)。如果您只在本地使用 lambda,我想您应该能够使用 var 关键字完成工作。
  • 我已经更改了我的示例代码。问题是我必须使用带参数的构造函数并设置其他一些属性。所以对象初始化器不考虑在内。
  • 您可以使用带参数的构造函数,但仍然可以使用对象初始化表达式设置属性 - 例如,请参阅我的答案。

标签: c# lambda inline-if


【解决方案1】:

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

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

【讨论】:

  • 呸,打败我:p 我会删除我的
  • 检查更改的代码。我没有写正确的例子。委托函数体比仅仅创建一个简单的对象实例更复杂。很抱歉。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2023-03-29
      相关资源
      最近更新 更多