我正在尝试像这样声明一个 PI 常量:
public static const double PI = Math.PI;
但为什么我会收到这个错误?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
我正在尝试像这样声明一个 PI 常量:
public static const double PI = Math.PI;
但为什么我会收到这个错误?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
const
暗示static
(您不需要实例来引用该const
值)。
我还想补充一点:当您使用 a 链接(引用)程序集时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
为一个单独的实体。注意:如果依赖 a 的程序在值更改
const
后没有重新编译,它们可能会中断 [因为它们将继续使用以前的值]。const
根据定义,常量是静态的。
你不能有静态常量。尝试 readonly 而不是 const 或简单地删除“static”,因为“const”无论如何都是隐含的静态。
在编译期间不能在代码中替换常量,而不是在运行时替换,因此不需要静态与实例定义。
所有常量声明都是隐式静态的,并且 C# 规范声明禁止(冗余)包含 static 修饰符。我相信这是为了避免读者看到两个常量时可能发生的混淆,一个声明为静态的,一个未声明——他们可以很容易地假设规范中的差异意味着语义上的差异。话虽如此,并没有禁止冗余指定访问修饰符,这也是默认访问修饰符,可以选择。例如,可以将(具体)方法显式标记为私有,尽管这是默认方法。规则似乎是在没有选择的情况下(例如接口中的方法声明),禁止使用冗余修饰符。哪里有选择,哪里就允许。