【问题标题】:C# string must be a constant [duplicate]C#字符串必须是一个常量[重复]
【发布时间】:2020-01-23 10:12:56
【问题描述】:

我正在写这段代码:

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

而且,编译器抱怨:
“分配给 VERSION_STRING 的表达式必须是常量”

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

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

提前致谢。 :)

【问题讨论】:

标签: c# string constants constant-expression


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当我们使用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}";
    

    【讨论】:

      【解决方案3】:

      您尝试设置的字符串不是常量值,因为它是从其他变量/常量派生而来的。

      尝试静态只读

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

      【讨论】:

      • public const string FOO = "bar";public readonly string FOO = "bar"; 的访问方式不同。对于const,您使用ClassName.FOO。对于readonly,您使用instantiatedObject.FOOconststaticreadonly 是实例的一部分
      【解决方案4】:

      解释为什么 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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-28
        • 2017-02-10
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-14
        • 2021-07-20
        相关资源
        最近更新 更多