常量不能标记为静态

时间:2012-10-31 02:16:23

标签: c#

我试图像这样声明一个PI常量:

public static const double PI = Math.PI;

但为什么我会收到此错误?

The constant 'Calendar.NewCalendar.PI' cannot be marked static

5 个答案:

答案 0 :(得分:184)

const隐含static(您不需要实例来引用const值)。

我还要添加这一重点:当您使用public const链接(引用)程序集时,该值将复制到您的程序集中。因此,如果引用的程序集中的const值发生更改,则程序集仍将具有最初编译的值。

如果此行为可接受,则应考虑将该字段设为public static readonly字段。

Lib.dll,以二进制文件形式提供:

public class Foo {
    public const int HATS = 42;
    public static readonly int GLOVES = 33;
}

App.exe,引用Lib.dll:

Foo.HATS    // This will always be 42 even if the value in Lib.dll changes,
            // unless App.exe is recompiled.

Foo.GLOVES  // This will always be the same as Foo.GLOVES in Lib.dll

来自MSDN

  

不要创建常量来表示您希望随时更改的信息。例如,不要使用常量字段来存储服务价格,产品版本号或公司的品牌名称。这些值可能会随着时间的推移而发生变化,并且由于编译器传播常量,因此必须重新编译使用库编译的其他代码以查看更改。

来自DotNetPerls

  

的DLL。当您使用const字段或声明时,C#编译器实际上将const变量的值直接嵌入到IL代码中。因此,它基本上将const删除为一个单独的实体。

     

注意:   如果在const值更改后未重新编译依赖于const的程序,则可能会中断[,因为它们将继续使用之前的值]。

答案 1 :(得分:13)

根据定义,常量是静态的。

答案 2 :(得分:9)

你不能拥有静态const。尝试readonly而不是const或简单地删除“static”,因为“const”无论如何都是静态的。

答案 3 :(得分:4)

在编译期间,代码中的常量不能替换,而不是运行时,因此不需要静态vs实例定义。

答案 4 :(得分:3)

所有常量声明都是隐式静态的,C#规范声明静态修饰符的(冗余)包含是禁止的。我相信这是为了避免在读者看到两个常量时可能出现的混淆,一个声明为静态而一个未声明 - 他们可以很容易地认为规范的差异意味着语义上的差异。话虽如此,没有禁止冗余地指定访问修饰符,这也是默认的访问修饰符,其中有一个选择。例如,(具体)方法可以显式标记为私有,尽管它是默认方法。该规则似乎是在没有选择的情况下(例如,接口中的方法声明),禁止使用冗余修饰符。如果有选择,那就是允许的。