Question

I want to write a lambda expression within an inline if statement. But inline if statement must have strong type results.

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

Of course this doesn't work, because lambda expression isn't strongly typed. I thought of using Func<intVal, MyType> delegate, to make it strong type.

But how do I use this Func<> inside inline if? Is it at all possible of would I have to define my own function outside and use it in inline if statement?

Was it helpful?

Solution

Even with the more complicated code, you can use an object initializer expression:

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

If you really want to use a lambda though, you could write:

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

However, this is frankly a nightmare of brackets and casts. You can make it simpler with a helper method:

public T Execute(Func<T> func)
{
    return func();
}

...

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

OTHER TIPS

It has nothing to do with the lambda's typing here. You are trying to return either null or (a function taking no arguments and returning a MyType) but you are telling the compiler that the result of that statement is not a function, but just a MyType. I think what you want to do is

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

If you have something like this ...

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

You will get the error ...

"There is no explicit conversion between null and lambda expression."

The reason for that is discussed in this SO thread.

Mark is correct on what you're trying to do with the code sample, except you can set the property in like as well like this ...

var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top