IT story

상수는 정적으로 표시 할 수 없습니다.

hot-time 2020. 9. 4. 08:08
반응형

상수는 정적으로 표시 할 수 없습니다.


다음과 같이 PI 상수를 선언하려고합니다.

public static const double PI = Math.PI;

하지만 왜이 오류가 발생합니까?

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

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 # 컴파일러는 실제로 constIL 코드에 직접 변수 값을 포함합니다. 따라서 본질적으로를 const별도의 엔티티로 지 웁니다 .

주의 : 값이 변경된 const후에 종속 된 프로그램을 다시 컴파일하지 않으면 const[ 이전 값을 계속 사용하므로 ] 이 중단 될 수 있습니다 .


상수는 정의상 정적입니다.


정적 const를 가질 수 없습니다. const 대신 readonly를 시도하거나 "const"가 어쨌든 정적을 암시하므로 "static"을 삭제하십시오.


런타임이 아닌 컴파일 중에 코드에서 상수를 바꿀 수 없으므로 정적 대 인스턴스 정의에 대한 요구 사항이 없습니다.


모든 상수 선언은 암시 적으로 정적이며 C # 사양에는 정적 한정자의 (중복) 포함이 금지되어 있다고 명시되어 있습니다. 나는 이것이 독자가 두 개의 상수를 볼 때 발생할 수있는 혼란을 피하기위한 것이라고 믿습니다. 하나는 정적으로 선언되고 다른 하나는 그렇지 않습니다. 그들은 사양의 차이가 의미의 차이를 암시한다고 쉽게 가정 할 수 있습니다. 즉, 선택이있는 기본 액세스 수정 자이기도 한 액세스 수정자를 중복 지정하는 것에 대한 금지는 없습니다. 예를 들어 (구체적인) 메소드는 기본값 임에도 불구하고 명시 적으로 비공개로 표시 될 수 있습니다. 규칙은 선택의 여지가없는 경우 (예 : 인터페이스의 메서드 선언) 중복 수정자는 금지되는 것 같습니다. 선택권이있는 곳에서는 허용됩니다.

참고 URL : https://stackoverflow.com/questions/13150343/the-constant-cannot-be-marked-static

반응형