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"
我正在写这段代码:
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"