常量不能标记为静态

Chi*_*hin 90 c#

我试图像这样声明一个PI常量:

public static const double PI = Math.PI;
Run Code Online (Sandbox Code Playgroud)

但为什么我会收到此错误?

The constant 'Calendar.NewCalendar.PI' cannot be marked static
Run Code Online (Sandbox Code Playgroud)

Jon*_*art 189

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;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

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

来自DotNetPerls:

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

注意:如果constconst值更改后没有重新编译依赖于a的程序,它们可能会中断[ 因为它们将继续使用之前的值 ].


jue*_*n d 14

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


its*_*e86 9

你不能有静态const.尝试readonly而不是const或简单地删除"静态",因为"const"无论如何都是隐含的静态.