2012-08-08 2 views
5

내가 코드의 오래 된 조각이 같은 열거있어을에서 int로 :이 열거에 대한 지금컴파일 시간 변환 C#

[Flags] 
public enum Example: uint 
{  
    Foo = 0x00000001, 
    Bar = 0xC0000000 
} 

, FxCop is complaining는 오히려 필드를 백업하는 것 같이 INT보다 UINT 사용. (그리고 나는이 코드를 가능한 한 깨끗한 FxCop로 가져 오도록 임무를 부여 받았다.) 그러나 열거 형의 상위 비트를 사용하는 기존 열거 형 값이 있는데이 열거 형을 계속 유지하기 때문에 변경할 수 없습니다. 디스크 형식. 나는 이것을 컴파일하려고하면 C# 컴파일러는 당연히 불만 :

error CS0266: Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?) 

을 그래서,이 대신에 그것을 변경하려고했다 :

[Flags] 
public enum Example 
{  
    Foo = 0x00000001, 
    Bar = (int)0xC0000000 
} 

을하지만, 내가 의지 할 수있는 긍정적 아니에요 이것은 산술 예외를 던지거나 디스크에 읽거나 쓸 때 올바르게 처리되지 않습니다. 열거 형이 부호없는 int에 의해 뒷받침 될 때 사용한 형식과 일치하는 비트 형식을 여기에 의지 할 수 있습니까?

+0

이것은 모든 FxCop 문제를 해결하지 못할 수도 있습니다. 모든 [Flags]'열거 형에 대해 'None'멤버가 있어야한다고 말하면 놀라지 않을 것입니다. 이것은 코드를 변경할 수없는 이유에 대한 설명과 함께 인라인 경고 억제를위한 아주 좋은 장소 인 것 같습니다. –

+0

@Cody : 네, 그 일을 끝낼 수도 있습니다. –

답변

8

여기에 선택되지 않은 키워드를 사용하면 괜찮습니다. 지속 된 비트 패턴이 예상대로됩니다.

[Flags] 
public enum Example 
{ 
    Foo = 0x00000001, 
    Bar = unchecked((int)0xC0000000); 
} 
0

토마스의 대답은 100 % 맞다,하지만 난 그게 내 세 센트를 추가합니다 : 대신 이미 정확했다 "고정"코드, 당신은 항상 코드의 어떤 부분의 FxCop 규칙을 supress 수 있습니다.

How do I suppress FxCop rule 'DoNotCatchGeneralExceptionTypes' with SupressMessage?을 참조하십시오. 사용 예를 들어 답을 받아 들였습니다. 모든 것은 코드와 .csproj에 설정되어 있으므로 모든 억압 설정은 최종 클라이언트에 제공 될 때 코드와 함께 유지됩니다.

+0

FxCop은 나쁜 아이디어 인 "올바른"것을 발견합니다. 내가 모든 것을 억압하면 그 점을 다소 패배시킨다. (분명히, "가능한 한 깨끗한 FxCop으로"내가하고있는 일은 우리의 억압을 통과하고 제거하는 것입니다.) –

+1

이전의 논평은 말도 안되었습니다. 내가 말하고자하는 것은 닷넷 자체가 FxCop 억지로 가득 차 있다는 점이다. 거의 모든 규칙에 대해 규칙이 "일반적으로 옳았지만 실제로는 원하지 않는"경우가 있습니다. 기본 저장 장치와의 호환성이 중요한 경우라고 생각합니다. 물론, 열거 형 및 어셈블리가 "서명되지 않은"언어를 사용하지 않는 한. 어쨌든, 당신이해야만한다면 - 할 : 토마스의 대답은 훌륭합니다. 방금 완성도를 위해 내 것을 추가했습니다. – quetzalcoatl