100

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

public static const double PI = Math.PI;

但为什么我会收到这个错误?

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

5 回答 5

205

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

于 2012-10-31T02:23:11.167 回答
15

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

于 2012-10-31T02:18:06.153 回答
9

你不能有静态常量。尝试 readonly 而不是 const 或简单地删除“static”,因为“const”无论如何都是隐含的静态。

于 2012-10-31T02:17:50.717 回答
4

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

于 2012-10-31T02:19:33.703 回答
3

所有常量声明都是隐式静态的,并且 C# 规范声明禁止(冗余)包含 static 修饰符。我相信这是为了避免读者看到两个常量时可能发生的混淆,一个声明为静态的,一个未声明——他们可以很容易地假设规范中的差异意味着语义上的差异。话虽如此,并没有禁止冗余指定访问修饰符,这也是默认访问修饰符,可以选择。例如,可以将(具体)方法显式标记为私有,尽管这是默认方法。规则似乎是在没有选择的情况下(例如接口中的方法声明),禁止使用冗余修饰符。哪里有选择,哪里就允许。

于 2017-08-25T08:00:11.943 回答