2017-12-19 23 views
0
[Flags] 
public enum EyeColors 
{ 
    None = 0, 
    Blue = 1 << 0, 
    Cyan = 1 << 1, 
    Brown = 1 << 2, 
    Black = 1 << 3, 
    Green = 1 << 4, 
    Browngreen = 2 | 4 
    // Browngreen = Brown | Green 
} 

바이너리 OR on [플래그] 열거 요소 - 플래그를 단순히 추가해도 안되는 이유는 무엇입니까?

Browngreen = 2 | 4 
Browngreen = Brown | Green 

Browngreen = 6 

작동 않지만하지 않습니다. Browngreen은이 날 퍼즐 6.


로 설정되어 wheren

EyeColors.Browngreen == (EyeColors.Brown | EyeColors.Green); 

같은 시험의 평가는 경우에 false로 평가합니다.

0100 : 2
0110 : 4
0010 방법은 내가 있도록 바이너리 또는 플래그 비트가 추가됩니다 것을 이해했을 때 6

그래서 왜 작동하지 않습니다 단지 세트?

Browngreen = 6; 
+2

1 << 3 (** 8 **) 갈색인가, 아니면 어떻게 든 4 갈색 (1 << 2 인, 당신의 열거가 아닌) : 여기

는 작업 예제? – oerkelens

+3

'&'와'| '가 같은 방식으로 작동하는 이유는 무엇입니까? 2 및 4 = 0 인 반면, 2 | 4 = 6이다. – oerkelens

+1

'Browngreen = 2 & 4'는 올바르게 동작하지 않을 것입니다. ('2 & 4'는 'Brown | Green'과 같이'0' ... 실제로'2 | 4'를 원합니다). 문제를 재현하는 실제 [mcve]와 함께 질문을 게시해야합니다. 지금까지 작성한 내용을 토대로 스택 오버플로 커뮤니티 나 코퍼스를 사용하지 않는 간단한 입력 오류가 발생합니다. 테스트를'EyeColors.Brown | EyeColors.Green'; 'Browngreen = 2 & 4'를 설정했을 때를 제외하고는 현재 가지고있는 것은 실패 할 것입니다. –

답변

0

플래그를 결합하려면 | 운영자. 바이너리로 생각하십시오. 10000 & 00100은 0 (없음)이지만 10000 | 00100은 10100, 따라서 20을 제공합니다.

또한 "모든"사례에서 "없음"플래그는 의미가 없으므로 삭제했습니다.

[Flags] 
public enum EyeColors 
{ 
    None = 0, 
    Blue = 1 << 0, // 1 
    Cyan = 1 << 1, // 2 
    Brown = 1 << 2, // 4 
    Black = 1 << 3, // 8 
    Green = 1 << 4, // 16 
    Browngreen = Brown | Green, 
    All = Blue | Green | Brown | Black | Cyan 
} 

void Main() 
{ 
    EyeColors eyeColors = EyeColors.Brown; 
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")"); 

    eyeColors = EyeColors.Brown & EyeColors.Green; 
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")"); // None 

    eyeColors = EyeColors.Brown | EyeColors.Green; 
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")"); // Brown green 

    eyeColors = (EyeColors)20; 
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")"); // Brown green also 

    eyeColors = EyeColors.All; 
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")"); 
} 
+0

고마워요. 내 초기 질문은 여전히 ​​남아 있습니다 : 열거 요소 인 Browngreen을 "Brown | Green"대신에 6으로 설정하지 못하는 이유는 무엇입니까? "Brown | Green"과 "6"은이 문맥에서 같은 의미가 아니어야합니까? –

+0

갈색 | 녹색은 6이 아니며 20입니다. 열거 형에 추가 한 주석을 확인하십시오. – AFract

+0

제 답변을 편집했습니다. 이해하기 쉽기를 바랍니다. 이 예제는 작동 중입니다. 원하는대로 linqpad에서 실행하거나 일반 C# 프로그램으로 빌드 할 수 있습니다. – AFract