【问题标题】:Correct syntax to initialize static array [duplicate]初始化静态数组的正确语法[重复]
【发布时间】:2015-03-22 00:52:42
【问题描述】:

我有以下代码定义一个数组

 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

【问题讨论】:

  • 我初始化了数组,那家伙没有。我头疼。这是我搜索它的一天。
  • 不,你没有初始化数组,这就是为什么你有一个类型初始化异常 - 你显示的空引用异常是所述类型初始化异常的内部异常。公平地说,我有点惊讶你声明PAlphCodes 甚至编译。

标签: c# arrays nullreferenceexception initializer


【解决方案1】:

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

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

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

它在运行时首先使用NullReferenceException 失败,因为数组的初始化在第一次使用时尚未完成 - 所以在创建数组时PAlphCodesnull。但由于这是类级初始化的一部分(因为它是静态文件),所以这个异常也会停止类实例的创建,你会得到“类型初始化器 ....”包装 NullReferenceException

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

字段初始化器不能引用非静态字段、方法或属性...

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

【讨论】:

  • 非常感谢您的简短回答和修改 xD。
【解决方案2】:

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

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

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

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

【讨论】:

  • 非常感谢,都成功了。
【解决方案3】:

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

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

【讨论】:

  • 您也可以使用string[] PAlphCodes = { "1593", "1604", "1740" }。这两个选项都有效且司空见惯。
  • 是的。我试图尽可能少地更改他的代码,以便他可以看到不需要的内容。不过,我应该包括这两种形式。
  • 很高兴为您提供帮助。另外,欢迎来到 Stack Overflow。请记得为您认为有用的问题/答案投票,不要忘记点击复选标记接受最有帮助的答案。
  • 我还需要15点声望。 xD
猜你喜欢
  • 1970-01-01
  • 2017-08-26
  • 2016-08-31
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多