字典初始化问题

时间:2018-07-14 14:25:52

标签: c#

为什么起作用

export PATH=...

这不是

.zprofile

我很困惑,因为如果我像类字段那样声明“函数”,第二种方法会起作用。

3 个答案:

答案 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) }
};