常数不能被标记为静态

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

public static const double PI = Math.PI; 

但为什么我得到这个错误?

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

const意味着static (你不需要一个实例来引用const值)。

我也想添加这个重要的一点:当你用一个public const引用一个程序集时,这个值被复制到你的程序集中。 所以如果引用程序集中的const值发生变化,程序集仍然会有原始编译的值。

如果这种行为是不可接受的,那么你应该考虑使该字段成为public static readonly字段。

以二进制forms提供的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 :

不要创build常量来表示您希望随时更改的信息。 例如,不要使用常量字段来存储服务的价格,产品版本号或公司的品牌名称。 这些值可以随着时间而改变,并且因为编译器传播常量,所以用你的库编译的其他代码将不得不被重新编译以查看改变。

来自DotNetPerls :

DLL文件。 当你使用const字段或声明时,C#编译器实际上是直接在IL代码中embeddedconstvariables的值。 因此,它基本上将const作为一个单独的实体来消除。

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

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

你不能有静态常量。 尝试只读而不是const,或者简单地删除“静态”,因为“const”隐含静态。

在编译期间,不能在代码中replace常量,因此不需要静态和实例定义。

所有常量声明都是隐式静态的,C#规范声明禁止使用静态修饰符(冗余)。 我相信这是为了避免如果读者看到两个常量,一个声明为静态而另一个不是 – 他们可以轻易地认为规范上的差异意味着语义上的差异,可能会发生混淆。 话虽如此,没有禁止冗余地指定访问修饰符,这也是默认选项。 例如,一个(具体)方法可以明确标记为私有,尽pipe这是默认的。 规则似乎是在没有select的地方(例如,在一个接口中的一个方法声明),冗余修饰符被禁止。 哪里有select,这是允许的。