Как определить переменную как функцию лямбда

(Лямбда-функция может быть или не быть тем, что я ищу, я не уверен)

По сути, я пытаюсь выполнить следующее:

int areaOfRectangle = (int x, int y) => {return x * y;};

но он дает ошибку: "Невозможно преобразовать лямбда-выражение в тип" int ", потому что это не тип делегата"

Более подробная проблема (которая действительно не имеет никакого отношения к вопросу, но я знаю, что кто-то спросит):

У меня есть несколько функций, которые выходят из переопределенного OnLayout и еще нескольких функций, от которых зависит каждый из них. Для удобства чтения и создания прецедента для последующего расширения я хочу, чтобы функции, которые отключались от OnLayout, выглядели одинаково. Для этого мне нужно разделить их и использовать как можно больше:

protected override void OnLayout(LayoutEventArgs levent)
    switch (LayoutShape)
    {
        case (square):
            doSquareLayout();
            break;
        case (round):
            doRoundLayout();
            break;
        etc..
        etc..
    }
void doSquareLayout()
{
    Region layerShape = (int Layer) =>
    {
        //do some calculation
        return new Region(Math.Ceiling(Math.Sqrt(ItemCount)));
    }
    int gradientAngle = (int itemIndex) =>
    {
        //do some calculation
        return ret;
    }
    //Common-ish layout code that uses layerShape and gradientAngle goes here
}
void doRoundLayout()
{
    Region layerShape = (int Layer) =>
    {
        //Do some calculation
        GraphicsPath shape = new GraphicsPath();
        shape.AddEllipse(0, 0, Width, Height);
        return new Region(shape);
    }
    int gradientAngle = (int itemIndex) =>
    {
        //do some calculation
        return ret;
    }
    //Common-ish layout code that uses layerShape and gradientAngle goes here
}

Все примеры, которые я сейчас нахожу, говорят, что вы должны объявить делегата, но я знаю, что видел однострочное объявление лямбда...

Ответ 1

Попробуйте Func<int, int, int> areaOfRectangle = (int x, int y) => { return x * y;};.

Func работает как делегат

Посмотрите здесь, чтобы узнать больше об использовании выражения lamda

Этот ответ также связан и имеет хорошую информацию

Если вы делаете это для удобства чтения и собираетесь воспроизводить те же функции layerShape и gradientAngle, вы можете захотеть иметь явные делегаты для этих функций, чтобы показать, что они на самом деле одинаковы. Просто мысль.

Ответ 2

Попробуйте это:

Func<int, int, int> areaOfRectangle = (int x, int y) => { return x * y; };

Отметьте Func<T1, T2, TResult> из MSDN;

Инкапсулирует метод, который имеет два параметра и возвращает значение тип, заданный параметром TResult.

Ответ 3

Тип переменной основан на ваших параметрах и возвращаемом типе:

Func<int,int,int> areaOfRectangle = (int x, int y) => {return x * y;};

Ответ 4

Вы близко:

Func<int, int, int> areaOfRectangle = (int x, int y) => {return x * y;};

Итак, для вашего конкретного случая ваша декларация будет следующей:

Func<int, Region> layerShape = (int Layer) =>
...