如何重载委托函数?

时间:2018-03-08 22:25:34

标签: c# delegates

我为对数函数创建一个委托,然后输入该委托作为另一个函数的参数。我希望对数函数能够使用一个参数默认为记录基数10或两个参数,它将日志基数更改为第二个参数的值。

目前我有

Func<double, double, double> pow = (x, y) => Math.Pow(x, y);
Func<double, double, double> log = (x, y) => Math.Log(x, y);
Func<double, double> log = x => Math.Log(x, 10);
Func<double, double> ln = x => Math.Log(x, Math.E);

var target = new Interpreter()
  .SetFunction("pow", pow)
  .SetFunction("ln", ln)
  .SetFunction("log", log);

有了这个,我收到以下错误:

A local variable or function named 'log' is already defined in this scope.

我明白为什么我会收到这个错误,这很简单。但我应该能够创建一个具有多个重载的委托函数,对吧?我的意思是这是2018年的c#。我必须有另一种方法来实现这一目标。

我也尝试了以下方法来实现同样的目标。

Func<double, double?, double> log = (x, y) => Math.Log(x, y == null 
     || double.IsNaN(y.Value) 
     || (y > 0.0 - double.Epsilon && y < 0.0 + double.Epsilon)  ? 10 : y.Value);

但是只有在我为第二个参数显式定义null时才有效。我希望能够省略第二个参数,它默认为基数为10。

谢谢!

2 个答案:

答案 0 :(得分:2)

方法重载基于方法 name 。代表没有名称,事实上你有变量名称是无关紧要的。此外,Func<double, double>Func<double, double, double>不同,对于泛型没有重载。

所以不,即使它是2018年,你也无法做到这一点有很多好的理由。您需要创建一个可以在&#34;重载&#34;之间进行选择的自定义类。基于某些条件(当然可能存在可选参数)。

答案 1 :(得分:2)

最好的解决方案是使用带有可选参数的本地函数。

double log(double x, double y = 10.0) => Math.Log(x, y);