我为对数函数创建一个委托,然后输入该委托作为另一个函数的参数。我希望对数函数能够使用一个参数默认为记录基数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。
谢谢!
答案 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);