正确的语法来初始化静态数组

时间:2015-01-23 02:40:09

标签: c# arrays nullreferenceexception initializer

我有以下代码定义数组

 public class PalphabetsDic
 {
     public static string[] PAlphCodes = new string[3] {
         PAlphCodes[0] = "1593",
         PAlphCodes[1] = "1604",
         PAlphCodes[2] = "1740",
     };
 }

当我使用这个数组时

var text = PalphabetsDic.PAlphCodes[1]

给出错误:

  

'Dota2RTL.PalphabetsDic'的类型初始值设定项引发了异常。   ---> System.NullReferenceException:未将对象引用设置为对象的实例。

有人可以帮我吗?

请注意,What is a NullReferenceException, and how do I fix it?涵盖数组,但PAlphCodes = new string[3]应将其设置为null

3 个答案:

答案 0 :(得分:6)

初始化您的方式时,您不需要索引值:

public static string[] PAlphCodes = new string[] {
            "1593",
            "1604",
            "1740",
        };

答案 1 :(得分:2)

为了扩展肯尼迪的回答 - 你也可以使用

public static string[] PAlphCodes = { "1593", "1604", "1740" };

参考手册列出了所有可能的方法 - 但肯尼迪建议的 - 以及这种方法 - 可能是最常见的。

https://msdn.microsoft.com/en-us/library/aa287601(v=vs.71).aspx

答案 2 :(得分:0)

事实上,您已经使用strnage语法初始化数组,如其他答案中所指出的那样,static string[] PAlphCodes = new []{"1","2","3"};之类的东西可以解决问题。

关于为什么这实际编译(这对大多数人来说有点令人惊讶):

您可以使用静态字段初始化其他静态字段,但令人惊讶的是,如果字段本身,您也可以在初始化内引用静态字段。所以没有编译时错误。

它首先在NullReferenceException的运行时失败,因为在第一次使用它时,数组的初始化没有完成 - 因此创建数组时PAlphCodesnull 。但由于这是类级初始化的一部分(因为它是静态字段),这个异常也会停止创建类实例,并且你得到了#34;类型初始化器...."包裹NullReferenceException

请注意,在大多数情况下,此类构造甚至不会编译。即 在编译时使用

在局部变量的非静态字段中使用它失败
  

字段初始值设定项不能引用非静态字段,方法或属性...

public class PalphabetsDic
{
 public string[] PAlphCodes = new string[3] {
     PAlphCodes[0] = "1593", // error here and other lines
     PAlphCodes[1] = "1604",
     PAlphCodes[2] = "1740",
 };
}