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

6
我有下面这段定义数组的代码。
 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:对象引用未设置为对象的实例。

请问有人能帮我解决这个问题吗?
请注意,什么是NullReferenceException,如何修复它?中涵盖了数组,但" PAlphCodes = new string[3] "应将其设置为非" null"。

我初始化了数组,那个人没有。我头疼了。我已经搜索了一天了。 - Ali Padida
1
不,你没有初始化数组,这就是为什么你有一个类型初始化异常 - 你展示的空引用异常是该类型初始化异常的内部异常。公平地说,我有点惊讶你的PAlphCodes声明甚至可以编译。 - Preston Guillot
3个回答

12

当初始化时,您不需要为值编制索引:

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

你也可以使用 string[] PAlphCodes = { "1593", "1604", "1740" }。这两种选项都是有效且常见的。 - debracey
真的。我试图尽可能少地更改他的代码,以便他可以看到哪些内容是不必要的。但我应该包含两种形式。 - Kennedy Bushnell
很高兴能够帮助你。同时,欢迎来到 Stack Overflow。请记得给你认为有用的问题/答案点赞,并且别忘了通过点击勾选标志接受最有帮助的答案。 - debracey
我仍需要15个声望。xD - Ali Padida

4

非常感谢,两个都有效。 - Ali Padida

1
实际上,正如其他答案所指出的那样,您使用了奇怪的语法来初始化数组,类似于 static string [] PAlphCodes = new [] {"1","2","3"}; 可以解决问题。

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

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

它会首先在运行时失败,因为在第一次使用它之前未完成数组的初始化-因此 PAlphCodes 为 null 而数组已创建。 但是,由于这是类级别的初始化的一部分(因为它是静态文件),因此此异常还会停止类实例的创建,并且您将获得“类型初始化程序....”包装 NullReferenceException 。

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

字段初始化程序无法引用非静态字段,方法或属性...

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

非常感谢您的简短回答和修改xD。 - Ali Padida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接