2017-12-19 34 views
2

I는 다음과 같은 코드가 -는 가변 int로에만 할당 될 수있는 오류를 생성

using System; 

namespace MyApp { 
class Program { 
    static void Main() { 
     byte x = 10, y = 20; 
     Console.WriteLine(x.GetType()); 
     Console.WriteLine(y.GetType()); 
     //byte z = (x+y); Error: (9,14): error CS0266: 
     //Cannot implicitly convert type 'int' to 'byte'. 
     //An explicit conversion exists (are you missing a cast?) 
     byte z = (byte)(x+y); 
     Console.WriteLine(z.GetType()); 
     Console.WriteLine(x); 
     Console.WriteLine(y); 
     Console.WriteLine(z); 
    } 
} 
} 

출력 :

System.Byte 
System.Byte 
System.Byte 
10 
20 
30 

하지만 byte z = x+y을 사용하는 경우 명시 적 유형 캐스팅 대신 오류가 발생합니다. -

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

그러나 코드에 표시된대로 컴파일러는 xy을 바이트로 읽습니다.

왜 2 바이트를 추가하면 명시 적 유형 캐스팅이 필요한 int가 생성되는 이유는 무엇입니까?

+2

'x + y'는 실제로 'int'이기 때문에. [byte + byte = int ... why?] (https://stackoverflow.com/q/941584/3744182)와 [C#에서 바이트 빼기에 필요한 캐스트가 왜 나오는가?] (https://stackoverflow.com/q)를 참조하십시오./927391/3744182). – dbc

답변

2

이것은 Implicit Conversion의 예입니다.

이 링크는 더 설명 : '바이트'해야에 대한 조작의

byte b = 32; byte c = ~b; // error CS0029: Cannot implicitly convert type 'int' to 'byte'

"그 결과

https://blogs.msdn.microsoft.com/oldnewthing/20040310-00/?p=40323

사람들은 다음과 같은 코드가 경고를 이끌어 불평 다른 '바이트'가 아니면 'int'가 아님 "이라고 주장합니다.

당신이 무엇을 요구하는지 조심하십시오. 너는 그걸 좋아하지 않을거야.

우리가 'byte'연산 인 ' '이 'byte'라는 환상적인 세계에 살았다 고 가정 해 보겠습니다. 이 환상의 세계에서

byte b = 32; byte c = 240; int i = b + c; // what is i?

, i 값은 16이 될 것입니다! 왜? + 연산자에 대한 두 개의 피연산자가 모두 바이트이므로 합계 "b + c"는 이 바이트로 계산되므로 정수 오버플로로 인해 16이됩니다. (앞서 언급 된 바와 같이 그리고 은 정수 오버플 새로운 보안 공격 벡터이다.) 유사하게

,

int j = -b;

, 값 224이 아닌 -32을 갖는 J 초래 같은 이유. ... 상상의 세계에서이 코드는 총 게임 수가 255를 초과하면 잘못된 결과를 반환합니다.이를 해결하려면 에 귀찮은 int 캐스트를 삽입해야합니다.

return ((int)captain.Wins + cocaptain.Wins) >= ((int)captain.Games + cocaptain.Games)/2;

그래서 당신이 그것을 슬라이스 아무리, 당신은 성가신 캐스트를 삽입해야 할 것입니다.보안 측면에 언어 오류가있을 수도 있습니다. (누설은 이 아닌 것으로 알고있는 곳에 캐스트를 삽입해야합니다.) 침묵의 측면에서 오류가 발생하는 것보다 더 많이 발생합니다 (여기서 누락 된 캐스트는 에 해당하지 않습니다. 급여 부서에서 월말에 권의 도서가 합산되지 않는 이유를 묻습니다.

+2

int x = 2147483647; int y = 2147483647; int z = x + y; 이로 인해 오버 플로우가 발생합니다. 왜 아무도 여기 걱정하지 않는 이유는 무엇입니까? @ paulsm4 – puregeek

+0

Raymond는 int가 오버플로한다고 생각하기 때문에 정상입니다. C++ 프로그래머가되는 책임;) –