views:

289

answers:

3

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?

+6  A: 

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);
Mark Rushakoff
bah, beat me to it :p I'll delete mine
Davy8
check the changed code. I haven't written the correct example. delegate function body is more complicated than just creating a simple object instance. Sorry for that.
Robert Koritnik
+4  A: 

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;
});
Jon Skeet
+1  A: 

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