示例 1
private const string _DefaultIconPath = _IconsPath + "default.ico";
private const string _IconsPath = "Icons/";
这些字符串在运行时的值:
- _DefaultIconPath:“图标/default.ico”
- _IconsPath: "图标/"
示例 2
private readonly string _DefaultIconPath = _IconsPath + "default.ico";
private readonly string _IconsPath = "Icons/";
编译时错误:
A field initializer cannot reference the non-static field, method, or property '_IconsPath'
示例 3
private static readonly string _DefaultIconPath = _IconsPath + "default.ico";
private static readonly string _IconsPath = "Icons/";
这些字符串在运行时的值:
- _DefaultIconPath:“default.ico”(_IconsPath 评估为
null
) - _IconsPath: "图标/"
问题
为什么编译器不会在示例 3 中抛出类似于示例 2 的编译错误?
声明的顺序在字段定义的情况下很重要static readonly
,但在字段定义的情况下不重要const
。
编辑:
我理解为什么将字符串初始化为这些特定值。我不明白为什么示例 2 会引发编译错误,强制初始化发生在构造函数中,而不是在变量的声明中(这很有意义),但示例 3 的行为方式不同。抛出相同的编译错误强制在静态构造函数中进行初始化是否有意义?
另一个例子
private static string test = test2;
private static string test2 = test;
这个例子演示了我要解释的内容。编译器可以强制在静态构造函数中初始化静态状态(就像实例变量一样)。为什么编译器允许它(或者为什么编译器不允许实例变量这样做)?