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

Correct syntax to initialize static array

我有以下定义数组的代码

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

当我使用这个数组时

var text = PalphabetsDic.PAlphCodes[1]

给出错误:

The type initializer for 'Dota2RTL.PalphabetsDic' threw an exception. ---> System.NullReferenceException: Object reference not set to an instance of an object.

有人可以帮我解决这个问题吗?

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

按照你现在的方式初始化时,你不需要索引值:

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

要扩展肯尼迪的回答——您也可以使用

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

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

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

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

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

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

它在 运行 时首先用 NullReferenceException 失败,因为数组的初始化在第一次使用时尚未完成 - 所以 PAlphCodesnull 在创建数组时。但由于这是 class 级别初始化的一部分(因为它是静态文件),此异常也会停止 class 实例创建并且您将 "The type initializer ...." 包装 NullReferenceException .

请注意,在大多数情况下,这种构造甚至无法编译。 IE。 在编译时在局部变量的非静态字段中使用它失败

A field initializer cannot reference the non-static field, method, or property ...

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