初始化静态数组的正确语法
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
失败,因为数组的初始化在第一次使用时尚未完成 - 所以 PAlphCodes
是 null
在创建数组时。但由于这是 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",
};
}
我有以下定义数组的代码
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
失败,因为数组的初始化在第一次使用时尚未完成 - 所以 PAlphCodes
是 null
在创建数组时。但由于这是 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",
};
}