문제

이 질문은 이미 여기에 답이 있습니다.

이 코드가 있습니다.

byte dup = 0;
Encoding.ASCII.GetString(new byte[] { (0x80 | dup) });

컴파일하려고 할 때 다음을 얻습니다.

유형 'int'를 '바이트'로 암시 적으로 변환 할 수 없습니다. 명백한 전환이 존재합니다 (캐스트가 놓치고 있습니까?)

왜 이런 일이 발생합니까? | 두 바이트가 바이트를 제공합니까? 각 항목이 바이트임을 확인하는 다음 작업 모두.

Encoding.ASCII.GetString(new byte[] { (dup) });
Encoding.ASCII.GetString(new byte[] { (0x80) });
도움이 되었습니까?

해결책

C#의 디자인에 의해 그런 식으로, 실제로 C/C ++로 돌아갑니다. 후자는 오페라를 홍보합니다. int, 당신은 보통 눈치 채지 못합니다 int -> char C#에 있지는 않지만 변환이 암시되어 있습니다. 이것은 단지 적용되는 것이 아닙니다 | 둘 중 하나이지만 모든 산술 및 비트 방향 피연산자 - 예를 들어 두 개 추가 byteS는 당신에게 줄 것입니다 int 또한. 여기에 사양의 관련 부분을 인용하겠습니다.

이진 숫자 프로모션은 사전 정의 된 +, - *, /, %, &, |, |, ^, ==,! =,>, <,> = 및 <= 이진 연산자의 피연산자에 대해 발생합니다. 이진 숫자 프로모션은 두 피연산자를 암시 적으로 공통 유형으로 변환하는데,이 유형은 비 관계형 연산자의 경우 결과 유형이됩니다. 이진 숫자 프로모션은 다음 규칙을 적용하는 것으로 구성됩니다.

  • 하나의 피연산자가 10 진수 유형 인 경우 다른 피연산자는 10 진수로 변환되거나 다른 피연산자가 유형 플로트 또는 이중 인 경우 컴파일 타임 오류가 발생합니다.

  • 그렇지 않으면, 하나의 피연산자가 이중 유형 인 경우 다른 피연산자는 이중 유형으로 변환됩니다.

  • 그렇지 않으면 피연산자 중 하나가 플로트 인 경우 다른 피연산자는 유형 플로트로 변환됩니다.

  • 그렇지 않으면, 피연산자 중 하나가 유형 Ulong 인 경우 다른 피연산자는 유형 Ulong으로 변환되거나 다른 피연산자가 SBYTE, SHORT, Int 또는 LONG 인 경우 컴파일 타임 오류가 발생합니다.

  • 그렇지 않으면, 피연산자 중 하나가 유형이 길면 다른 피연산자는 유형으로 변환됩니다.

  • 그렇지 않으면, 피연산자 중 하나가 UINT 유형이고 다른 피연산자는 SBYTE, SHORT 또는 INT 인 경우, 두 피연산자 모두 유형으로 변환됩니다.

  • 그렇지 않으면, 하나의 피연산자가 유형 UINT 인 경우 다른 피연산자는 유형 UINT로 변환됩니다.

  • 그렇지 않으면 두 피연산자 모두 유형 int로 변환됩니다.

나는 이것에 대한 정확한 근거를 모르지만, 나는 하나에 대해 생각할 수 있습니다. 산술 연산자에게 특히 사람들이 얻는 것이 약간 놀라운 일입니다. (byte)200 + (byte)100 갑자기 동일합니다 44, 관련된 유형을 신중하게 고려할 때도 의미가 있더라도. 반면에, int 일반적으로 가장 일반적인 숫자에 대한 산술에 대해 "충분한"유형으로 간주되므로 두 인수를 모두 홍보함으로써 int, 당신은 대부분의 일반적인 경우에 일종의 "그냥 작동"행동을 얻습니다.

이 논리가 왜 Bitwise 연산자에게도 적용되었는지에 관해서는 이것이 대부분 일관성을위한 것이라고 생각합니다. 그것은 하나의 간단한 규칙을 만듭니다. 모두 비-공과 이진 유형.

그러나 이것은 모두 대부분 추측입니다. Eric Lippert는 아마도 C#에 대한이 결정의 실제 동기에 대해 물어 보는 사람 일 것입니다. 그대로 규칙을 변경할 이유가 없었습니다. ").

다른 팁

문자 0x80에는 "int"유형이 있으므로 바이트를 사용하지 않습니다.

BYTE []에게만 전달할 수 있다는 것은 0x80 (문자 그대로)이 바이트 범위 내에 있기 때문에 작동합니다.

편집하다: 0x80이 바이트에 캐스트 되더라도 코드는 여전히 컴파일되지 않습니다. 그것을 컴파일하려면, 결과는 캐스트되어야합니다. (byte)(0x80|dup)

byte dup = 0;
Encoding.ASCII.GetString(new byte[] { (byte)(0x80 | dup) });

두 바이트에서 약간 또는 (|)의 결과는 항상 int입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top