常量无法标记为静态。

108

我正在尝试声明一个常量 PI:

public static const double PI = Math.PI;

但是为什么会出现这个错误?

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

1
可能是重复的问题 https://dev59.com/z3RC5IYBdhLWcg3wG9Nb - himanshupareek66
5个回答

217

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#编译器实际上会直接在IL代码中嵌入const变量的值。因此,它本质上将const擦除为一个单独的实体。

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


15

常量是根据定义静态的。


这个适用于 Java 中的 final 吗? - Basheer AL-MOMANI
1
@BasheerAL-MOMANI:不,final只是在构造函数调用后不可更改。没有其他的。 - juergen d

10
您不能使用静态常量。请尝试使用readonly代替const或者直接去掉“static”,因为“const”已经隐含了静态属性。

4

在编译期间,无法替换代码中的常量,也就是说,静态和实例定义没有要求。


3
所有的常量声明都是隐式静态的,C#规��规定,(冗余的)static修饰符的包含是被禁止的。我认为这是为了避免读者看到一个声明为static的常量和一个未声明为static的常量,并轻易地假设两者在语义上有所不同而引起混淆。话虽如此,在可以选择的情况下,冗余指定默认访问修饰符是允许的。例如,尽管private是默认访问修饰符,但具体方法仍然可以明确标记为private。规则似乎是,在没有选择的情况下(例如在接口中的方法声明),禁止使用多余的修饰符;而在有选择的情况下,则允许使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接