C#字符串必须是常量

C# string must be a constant

我正在写这段代码:

public const int MAJOR_VERSION = 3;
public const int MINOR_VERSION = 3;
public const string VERSION_STRING = $"v.{MAJOR_VERSION}{MINOR_VERSION}";

而且,也许并不奇怪,编译器在抱怨:
"The expression being assigned to VERSION_STRING must be constant"

我知道 const 表达式旨在由编译器传播,但在这种特殊情况下,可以很容易地静态创建字符串,因为它仅依赖于其他常量。

所以也许有人可以向我解释为什么这还不是该语言的一个特性? 或者甚至,为什么问这样的问题对我来说很愚蠢..

提前致谢。 :)

您出现此错误是因为字符串前面的 $ 符号是调用 String.Format() 的快捷方式。 String.Format() 作为方法,它的 return 值不能存储在常量中。

您尝试设置的字符串不是常量值,因为它是从其他 variables/constants.

派生的

改用静态只读

public static readonly string VERSION = $"v.{MAJOR_VERSION}{MINOR_VERSION}";

当我们使用const关键字时,字符串插值的值必须是一个编译时常量。使用字符串插值需要执行 .NET 代码,这只能在应用程序处于 运行 时发生,而不是在编译期间发生。

所以您可以使用 static readonly:

而不是 const
public const int MAJOR_VERSION = 3;
public const int MINOR_VERSION = 3;
public static readonly string  VERSION_STRING = $"v.{MAJOR_VERSION}{MINOR_VERSION}";

解释为什么 C# 团队不能将此作为编译时功能:

$"{}" 或 string.Format() 的结果在运行时可能会有所不同,具体取决于当时 运行 所在机器的文化。

例如,在这里看到 VERSION 是一个常量,但生成的字符串不同。

const double VERSION = 3.3;

string withDots   = String.Format(new System.Globalization.CultureInfo("en-GB"), "{0:N}", VERSION));
// "3.3"

string withCommas = String.Format(new System.Globalization.CultureInfo("fr-FR"), "{0:N}", VERSION));
// "3,3"