为什么起作用
export PATH=...
这不是
.zprofile
我很困惑,因为如果我像类字段那样声明“函数”,第二种方法会起作用。
答案 0 :(得分:0)
问题在于,在定义字典成员时:
{"Square", a => b => functions["^"](a)(2) },
字典对象尚未分配给变量functions
。
但是将最后一个成员定义为:
{"Square", a => b => Math.Pow(a, 2) },
{"Sqrt", a => b => Math.Pow(a, 0.5) }
肯定会工作。
答案 1 :(得分:0)
您可以改为:
Dictionary<string, Func<double, Func<double, double>>> functions = null;
functions = new Dictionary<string, Func<double, Func<double, double>>>()
{
{"+", a => b => a + b },
{"-", a => b => a - b },
{"*", a => b => a * b },
{"/", a => b => a / b },
{"^", a => b => Math.Pow(a, b) },
{"Square", a => b => functions["^"](a)(2) },
{"Sqrt", a => b => functions["^"](a)(0.5) }
};
您的问题是您不能在变量自己的声明中使用变量。例如:
int a = 2 * a;
还会给您一个编译错误。
您可以通过简单地确保编译器在使用functions
之前知道其值来解决您的问题。在您的情况下,这样做是安全的,因为您的值是委托,并且在声明变量之后才调用。
它在类声明中起作用,因为当您在类中声明成员时:
public class Foo { public int a; }
public static void Main()
{
Console.WriteLine((new Foo()).a.ToString()); //"0"
int a = 2 * a; //Compile error
}
在类中声明时,编译器将自动将a初始化为0。但是,在您自己的方法中,编译器的行为方式不同。
答案 2 :(得分:0)
因为functions
在初始化时未分配给任何东西。例如此示例:
var dict = new Dictionary<int, int> {
{ 1, 2 },
{ 3, dict[1] } // CS0841 Cannot use local variable 'dict' before it is declared
}; // CS0165 Use of unassigned local variable 'dict'
与以下相同:
Dictionary<int, int> dict; // dict is not assigned to anything and is null
var tempDictionary = new Dictionary<int, int>();
tempDictionary.Add(1, 2);
tempDictionary.Add(3, dict[1]); // CS0165 Use of unassigned local variable 'dict'
dict = tempDictionary; // now dict is assigned and can be used
请注意,接受两个参数的square和sqrt函数似乎很违反直觉。
替代方法可以使用临时变量,或者在字典前声明幂函数。
// using FdFdd = System.Func<double, System.Func<double, double>>; // at the top of the file
FdFdd temp;
var functions = new Dictionary<string, FdFdd>()
{
{ "+", a => b => a + b },
{ "-", a => b => a - b },
{ "*", a => b => a * b },
{ "/", a => b => a / b },
{ "^", temp = a => b => Math.Pow(a, b) },
{ "Square", a => b => temp(a)(2) },
{ "Sqrt", a => b => temp(a)(0.5) }
};