2017-11-30 11 views
8

C# 코드의 조각은VS 디버그 문제는 누가 설명 할 수 있습니까?

var isTrue = (new List<int>{1,2,3} is IEnumerable<object>); 

나는 코드 실행, 의 결과 false있어하지만 난 시계 창에 코드가, 결과는 true 것을 복사 할 때.

+1

나는'IEnumable'이 오타라고 가정합니다. – casiosmu

+0

[공분산 및 대조법의 차이점]의 가능한 복제본 (https://stackoverflow.com/questions/2184551/difference-between-covariance-contra-variance) –

+0

TL : DR : a : List 은 'IEnumerable '이지만'IEnumerable '은 아닙니다. 'false'가 올바른 결과입니다. –

답변

0

이것은 완전한 대답이 아닙니다. (나는이 버그가 왜 자르는지 이유를 모르지만) 분명히 버그가있는 디버거의 비정상적인 동작에 대해 밝히고 있습니다.

먼저 C#은 (또한 AFAIK, CLR도) 유형의 분산 유형을 포함합니다. 침범 된 유형 간의 변환을 보존 정체성이있는 경우 분산 만, 그렇지 않으면 실패합니다 허용됩니다 (값 형식에 대한 변환을 보존 아무런 정체성이 없다) :

디버거의 직접 실행 창 분명히 잘못

object[] oo = new int[] {1, 2, 3}; //will fail 
IEnumerable<object> oo = new int[] {1, 2, 3}; //will fail 
, new List<int> { 1, 2, 3 } is IEnumerable<object>은 반환해야합니다 false은 런타임과 동일합니다. true을 돌려주는 이유는 무엇입니까? 버그가 있기 때문에, 마침표.

무엇 더욱 당황하게 만드는 것은 int[]List<int> 같은 IEnumerable<int>에 암시 적으로 변환 될 때 new int[] { 1, 2, 3 } is IEnumerable<object>false을 반환 correclty 것이라는 사실이다.

후자의 올바른 동작을 찾을 수있는 유일한 이유는 컴파일러가 경고로 항상 false이라는 식으로 플래그를 지정하므로 컴파일러에서 배열 시나리오를 분석하는 방식이 다른 IEnumerable과 다릅니다.

+0

예, IDE 창에 의심스러운 유형 경고가 있습니다 .as ur words, erratic이 핵심 요소입니다. –