Есть ли способ разыграть функцию - PullRequest
2 голосов
/ 03 ноября 2010

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

// Add two integers
Func<int, int, int> addInts = (x, y) => { return x + y; };

// Add one to  an integer
Func<int, int> addOne = (x) => { return x++; };

// In this case Func takes 2 args and has 1 return
public int IntCalc(Func<int,int,int> operation, int param1, int param2)
{
    return operation(param1, param2);
}

// In this case Func takes 1 arg and has 1 return
public int IntCalc(Func<int, int> operation, int param1, int param2)
{
    // This cast would allow me to do the overload
    Func<int, int, int> castedOperation = (Func<int, int, int>)addOne;
    return IntCalc(castedOperation, param1, 0);
}

Так есть ли способ сделать это? Это ужасная практика?

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

Вы можете приводить только в том случае, если подписи параметров совместимы. В вашем случае вам нужно определить лямду, поскольку преобразование функции с одним параметром в функцию с двумя параметрами в общем случае не имеет смысла.

  Func<int, int, int> castedOperation = (i1,i2)=>addOne(i1);

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

Как sidenode ваша функция addOne действительно ужасна. Хотя увеличение x не имеет никакого эффекта, поскольку параметр копируется, и, следовательно, увеличивается и отбрасывается только копия, его реализация в виде return x+1; будет намного лучше, чем return x++;, поскольку на самом деле вы не хотите изменять x. *

1 голос
/ 03 ноября 2010

Если все ваши параметры одного типа, вы можете использовать params

adder(bool sample, params int[] a)
{
  ....
}

adder(2,3,4);

также вы можете использовать Именованный параметр в C # 4.0.

Ваш подход полезен для конструкторов (вы можете сделать это с ними). ​​

1 голос
/ 03 ноября 2010

Помимо принятого ответа вы также должны изменить addOne на операцию. Таким образом, полная функция будет

// In this case Func takes 1 arg and has 1 return
public int IntCalc(Func<int, int> operation, int param1, int param2)
{
    // This cast would allow me to do the overload
    Func<int, int, int> castedOperation = (i1,i2)=>operation(i1);
    return IntCalc(castedOperation, param1, 0);
}
...