2009-03-31 6 views

답변

68

의 차이점은 다음과 같습니다 캐스트가 실패

  • 경우는 InvalidCastException가 발생합니다.
  • as 연산자가 실패하면 null 참조 만 반환합니다.
  • as은 nullable 값 유형과 함께 사용할 수 없습니다 (예 : "o as int"을 사용할 수 없음).
  • 캐스트 연산자는 언 박싱에도 사용됩니다. (as은 nullable 값 유형에 대해 unbox하는 데 사용할 수 있습니다.)
  • 캐스트 연산자는 사용자 정의 변환을 수행 할 수도 있습니다.

EDIT : 어떤 연산자를 사용하는 것이 적절하다고 생각하면 대략 written elsewhere입니다. 읽는 가치가있을 수 있습니다 ...

+1

Jon을 참조 유형으로 업데이트하겠습니다. – Xaisoft

+0

별로 필요하지 않습니다 - 지금 내 답변에 더 많은 설명했습니다 :) –

+0

정말 고마워, 실제로 GridView로 업데이 트했는데, 당신의 대답은 충분히 좋다. – Xaisoft

1

그러나 참조 유형을 사용하면 테이블에 첫 번째 것은 InvalidCastException을 발생시키고 테이블에 할당 할 수없는 경우에는 두 번째가 null을 반환합니다.

2

일반적으로 정적 캐스트와 "as"의 차이점은 캐스트가 실패 할 경우 Exception을 던지는 반면 "as"는 변수를 null로 설정한다는 것입니다.

2

"as"문은 기본적으로 변수를 캐스팅하려고 시도하고 예외를 throw하지 않고 실패하면 null을 반환합니다. 따라서 사용자가 캐스팅하는 값은 null 허용 가능 유형 (참조 유형 또는 null 가능 프리미티브)이어야합니다. 귀하의 예에서는 다음을 수행해야합니다.

int? i2 = o as int; 

또는 컴파일하지 않아야합니다.

2

안전한 캐스트

variable as type 

등은

(variable is type) ? (type)variable : (type)null 

과 동일한을 수행하고 값 유형에 대해 작동하지 않습니다.

1

Jon이 지적한 문제 외에도 as 키워드는 o을 효과적으로 SomeClass으로 캐스팅합니다. oSomeClass에서 파생되지 않은 경우 null을 반환합니다. 반면에 간단한 캐스트는 예외를 던질 것입니다. 왜 당신이 변환을 수행하고, (더 중요한) 무엇 변환 후 라인에서 발생 -

SomeClass i2 = o as SomeClass; 

위의 답변에서 언급되지 않은 어떤

SomeClass i2; 
if (o is SomeClass) 
    i2 = (SomeClass)o; 
else 
    i2 = null; 
8

의도입니다된다 ?

:

if ((foo as SomeType).SomeMethod()) { /* ... */ }

이이 캐스트 - 사용 버전에 비교 될 수있다 :

예를 들어, 나는 시간의 다음과 같은 다수의 유사한 코드를 본 적이

if (((SomeType) foo).SomeMethod()) { /* ... */ }

그럼 어느 것이 더 낫지?

캐스트입니다.

as을 사용하면 변환에 실패하면 NullReferenceException이됩니다.

변환을 실패하면 캐스트를 사용하면 InvalidCastException이됩니다.

이제는 디버깅에 더 유용한 예외입니까? 거의 모든 것으로 제작 될 수있는 NullReferenceException 또는 실제로 잘못 된 것이 무엇인지 알 수있는 InvalidCastException? 따라서

, 사용 as 변환이 경우 실제로 옵션 ( 변수를 사용하기 전에 null 검사가 있어야한다는 것을 의미). 그렇지 않으면 캐스트를 사용하여 의도를보다 분명하게 만듭니다.

0

내가 여기에 분명히 표시되어있을 수도 있지만 'as'캐스트를 사용하면 얻을 수있는 것 중 하나는 요청한 유형의 개체로 끝나게된다는 것입니다. 이것은 특정 상황에서 유용합니다.

관련 문제