Are there any official ways to write an Immediately Invoked Function Expression?

c#

Solution

I'm surprised no one's mentioned this yet, but you could use the `Lazy<T>` class:

var myObject = new MyClass()
{
    x = new Lazy<string>(() =>
    {
        //Do stuff..
        if (2 + 2 == 5)
            return "I like cookies";
        else if (2 + 2 == 3)
            return "I like muffins";
        //More conditions...
        else
            return "I'm a bitter old man";
    }).Value // <-- Evaluate the function here
};

Alternatively, if you want to avoid having to specify the return type anywhere (as you do with `new Lazy<string>` because constructors do not support type inference), you can implement a simple generic method like this:

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

And then you can call like this:

var myObject = new MyClass()
{
    x = Eval(() =>
    {
        //Do stuff..
        if (2 + 2 == 5)
            return "I like cookies";
        else if (2 + 2 == 3)
            return "I like muffins";
        //More conditions...
        else
            return "I'm a bitter old man";
    })
};

Update: C#7 introduces local functions. These are not really IFFEs, but they may solve a variety of related issues. For example:

var myObject = new MyClass()
{
    x = GetX()
};

string GetX() {
    //Do stuff..
    if (2 + 2 == 5)
        return "I like cookies";
    else if (2 + 2 == 3)
        return "I like muffins";
    //More conditions...
    else
        return "I'm a bitter old man";
}

The key here is that `GetX` can be declared within the same method as `myObject` share the same scope as it.

Problem

Something like this: ``` var myObject = new MyClass() { x = " ".Select(y => { //Do stuff.. if (2 + 2 == 5) return "I like cookies"; else if (2 + 2 == 3) return "I like muffins"; //More conditions... else return "I'm a bitter old man"; }) }; ``` I realize Select is not intended to be used this way. But yeah, what are some other ways to do the same thing?

Original source