常数不能被标记为静态
我正在试图像这样声明一个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代码中embeddedconst
variables的值。 因此,它基本上将const
作为一个单独的实体来消除。注意:如果在
const
值更改之后,依赖于const
程序不重新编译,则可能会中断[ 因为它们将继续使用以前的值 ]。
根据定义,常量是静态的。
你不能有静态常量。 尝试只读而不是const,或者简单地删除“静态”,因为“const”隐含静态。
在编译期间,不能在代码中replace常量,因此不需要静态和实例定义。
所有常量声明都是隐式静态的,C#规范声明禁止使用静态修饰符(冗余)。 我相信这是为了避免如果读者看到两个常量,一个声明为静态而另一个不是 – 他们可以轻易地认为规范上的差异意味着语义上的差异,可能会发生混淆。 话虽如此,没有禁止冗余地指定访问修饰符,这也是默认选项。 例如,一个(具体)方法可以明确标记为私有,尽pipe这是默认的。 规则似乎是在没有select的地方(例如,在一个接口中的一个方法声明),冗余修饰符被禁止。 哪里有select,这是允许的。