C# 该常量不能标记为静态

C# 该常量不能标记为静态,c#,C#,我试图声明一个PI常数,如下所示: public static const double PI = Math.PI; 但是为什么我会犯这个错误呢 The constant 'Calendar.NewCalendar.PI' cannot be marked static 你不能有静态常数。尝试只读而不是常量,或者简单地删除“static”,因为“const”无论如何都意味着静态。常量的定义是静态的。编译过程中不能在代码中替换常量,而不是在运行时,因此不需要静态与实例定义。const意味着st

我试图声明一个PI常数,如下所示:

public static const double PI = Math.PI;
但是为什么我会犯这个错误呢

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

你不能有静态常数。尝试只读而不是常量,或者简单地删除“static”,因为“const”无论如何都意味着静态。

常量的定义是静态的。

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

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

我还想补充这一点:当您链接(引用)具有
公共常量的程序集时,该值将复制到您的程序集中。因此,如果引用的程序集中的
常量值发生更改,您的程序集仍将具有最初编译的值

如果此行为是不可接受的,那么您应该考虑将字段设为<代码>公共静态只读< /代码>字段.< /p> Lib.dll,以二进制形式提供:

App.exe,引用Lib.dll:


发件人:

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

发件人:

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

警告: 如果依赖于
常量的程序在
常量
值更改后未重新编译,它们可能会中断[因为它们将继续使用以前的值]


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

在java中,此修饰符是否应用于'final'too@BasheerAL-莫曼尼:不。在构造函数调用之后,期末考试是不可更改的。仅此而已。
public class Foo {
    public const int HATS = 42;
    public static readonly int GLOVES = 33;
}
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