2010-08-19 4 views
11

.NET 4.0/VS 2010의 TryCast 동작이 다소 혼란 스럽습니다.DirectCast가 작동하는 곳에서 TryCast가 실패합니다 (.NET 4.0)

내 생각에 TryCast는 DirectCast와 유사하지만 캐스트를 사용할 수없는 경우 예외를 throw하는 대신 Nothing을 반환합니다.

VS 2010/.NET 4

?TryCast(CType(1, Object), String) 
Nothing 
?DirectCast(CType(1, Object), String) 
"1" 

VS 2008/.NET 3.5

?TryCast(CType(1, Object), String) 
Nothing 
?DirectCast(CType(1, Object), String) 
Cannot convert to 'String'. 

3.5 결과 내가 TryCast가하는 생각 것과 일치하는 .NET ... 그러나 .NET 4는 그렇지 않습니다.

.NET 4에서 개체를 String으로 안전하게 캐스트 할 수있는 가장 좋은 방향을 알려주십시오.

답변

16

?으로 시작하는 코드 샘플을 바탕으로 직접 실행 창을 사용하여 정확한 테스트를 수행하고 있다고 생각하십니까? 이 접근 방식의 문제점은 즉각적인 창은 실제 평가가 아니라 해석이라는 것입니다. 이것은 미묘한 코너 케이스 버그에 감염되기 쉽고 이것은 실제로 그들 중 하나입니다.

예제 코드를 가져 와서 간단한 VB.Net 콘솔 응용 프로그램에 추가하면 2010 년 동작이 2008 동작과 동일하다는 것을 알 수 있습니다 (예외가 발생 함).

편집

는 왜이 회귀 된거 야? 2010 년에는 VB EE 디버깅 엔진 (표현식 평가 기)을 완전히 다시 작성했습니다. 내가 상속 한 이전 코드 기반은 단순히 관리하기에는 너무 비쌌다. 엔진에 새로운 기능을 추가하는 것이 새로운 기능을 포함하는 더 나은 아키텍처로 처음부터 다시 작성하는 것보다 비용이 많이 듭니다.

디버깅하기 전에 디버깅 평가는 코드 실행 이상의 해석입니다. EE와 CLR/Compiler간에 알고리즘의 중복을 강제합니다. 복제가 발생하는 영역 중 하나가 캐스팅 로직에 있습니다. 디버그 시간 객체를 전송하도록 CLR 디버거에 요청하는 방법은 없습니다. 지정된 언어가 실제로 유효한지 여부를 확인하는 것은 EE의 책임입니다.

오래된 EE 캐스팅 로직에는 수많은 버그가있었습니다 (특히 제네릭 및 어레이 영역에서). 최신 인프라는 CLR 가이드 라인을 준수합니다. 그러나 EE에서 매우 유용한 표현을 허용하지 않기 때문에 100 % 패리티를 얻지 못할 것입니다 (앞으로이 블로그 게시물을 작성할 수 있습니다). 그러나 대부분의 경우 행동은 유지됩니다.

이 특별한 경우에는 Object으로 입력되는 값의 DirectCast가 VB의 런타임 변환 연산자와 CLR 변환 만 허용되는 지정된 동작을 사용할 수 있도록하는 미묘한 버그가 추가되었습니다. 따라서이 변환은 실패해야하는 위치에서 성공합니다.

+0

나는 당신이 제안한 것을 확인했다. DirectCast()는 실제로 실제 평가에서 실행될 때 예외를 throw합니다. 설명 주셔서 감사합니다! – motto

+0

정확히 무슨 일이 일어 났는지 설명 할 수 있다면 정말 멋질 것입니다. – SLaks

+0

@SLaks에 대한 간단한 설명이 추가되었습니다. – JaredPar