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

C# 如何编写强类型lambda表达式?,c#,lambda,inline-if,C#,Lambda,Inline If,我想在内联if语句中编写lambda表达式。但内联if语句必须具有强类型结果 MyType obj = someObj.IsOk ? null : () => { MyType o = new MyType(intVal); o.PropertyName = false; return o; }; 当然这不起作用,因为lambda表达式不是强类型的。我想使用Funcdelegate,使其成为强类型 但是如何在内联if中使用这个Func?我是否有可能在外部定义自己的函数并

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

MyType obj = someObj.IsOk ? null : () => {
   MyType o = new MyType(intVal);
   o.PropertyName = false;
   return o;
};
当然这不起作用,因为lambda表达式不是强类型的。我想使用
Func
delegate,使其成为强类型


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

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

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

这和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;
}))();
MyType obj=someObj.IsOk?null:((Func)(()=>{
MyType o=新的MyType(intVal);
o、 ProName=false;
返回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;
});
public T执行(Func Func)
{
返回func();
}
...
MyType obj=someObj.IsOk?空:执行(()=>{
MyType o=新的MyType(intVal);
o、 ProName=false;
返回o;
});

即使使用更复杂的代码,也可以使用对象初始值设定项表达式:

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;
}))();
MyType obj=someObj.IsOk?null:((Func)(()=>{
MyType o=新的MyType(intVal);
o、 ProName=false;
返回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;
});
public T执行(Func Func)
{
返回func();
}
...
MyType obj=someObj.IsOk?空:执行(()=>{
MyType o=新的MyType(intVal);
o、 ProName=false;
返回o;
});

如果你有这样的东西

  var obj = (someObj.IsOK) ? null : () => {
             return new MyType(intVal) { PropName =false }; }
var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
您将得到错误

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

本文将讨论其原因

Mark对代码示例所做的操作是正确的,除非您可以像这样设置属性

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

如果你有这样的东西

  var obj = (someObj.IsOK) ? null : () => {
             return new MyType(intVal) { PropName =false }; }
var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
您将得到错误

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

本文将讨论其原因

Mark对代码示例所做的操作是正确的,除非您可以像这样设置属性

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

嗯,我不知道您将如何处理保存的lambda(在本地使用它或将它传递给其他对象/方法)。如果您只在本地使用lambda,我想您应该能够使用var关键字完成您的工作。问题是我必须使用带参数的构造函数,还必须设置一些其他属性。因此,不考虑对象初始值设定项。您可以使用带参数的构造函数,但仍然可以使用对象初始值设定项表达式设置属性-例如,请参阅我的答案。我不知道您将如何处理保存的lambda(在本地使用它或将它传递给其他对象/方法)。如果您只在本地使用lambda,我想您应该能够使用var关键字完成您的工作。问题是我必须使用带参数的构造函数,还必须设置一些其他属性。所以不考虑对象初始值设定项。您可以使用带参数的构造函数,但仍然可以使用对象初始值设定项表达式设置属性-例如,请参见我的答案。呸,告诉我:p我将删除我检查更改的代码。我没有写出正确的例子。委托函数体比创建简单的对象实例更复杂。很抱歉。呸,快告诉我:p我会删除我的。检查更改后的代码。我没有写出正确的例子。委托函数体比创建简单的对象实例更复杂。对不起。