Ответ 1
A двоичный оператор - это любая функция, которая принимает два операнда. Просто абстрагировать эту функциональность с помощью делегатов, которые в основном являются обертками вокруг методов (функций).
Чтобы сделать это более ясным, мы можем определить общий метод, который не делает ничего более, что вызывает делегата, используя указанные параметры, и возвращает его результат:
public Tout GetResult<TIn, TOut>(TIn a, TIn b, Func<TIn, TIn, TOut> @operator)
{
return @operator(a, b);
}
И вы можете использовать его для передачи любой комбинации параметров и операторов:
private bool AreEqual(int a, int b)
{
return a.Equals(b);
}
private int Subtract(int a, int b)
{
return a - b;
}
Затем вы можете использовать один и тот же общий метод для выполнения любой операции, которую вы хотите:
// use the "AreEqual" operator
bool equal = GetResult(10, 10, AreEqual);
// use the "Subtract" operator
int difference = GetResult(10, 10, Subtract);
Используя лямбда-выражения, вы даже можете создать оператор "на лету", указав его как анонимный метод:
// define a "Product" operator as an anonymous method
int product = GetResult(10, 10, (a,b) => a*b);