2014-11-25 2 views
2

그래서 다음과 같은 "문제"가 발생했으며 그 이유에 대해 궁금합니다.명시 적 캐스트 연산자와 T와 마찬가지로

는 다음과 같은 고려 :

public class B 
{ 

} 

public class A<T> 
{ 
    private void AFunc(T t) 
    { 
     FuncRequireB((B)t); // Not allowed 
     FuncRequireB(t as B); // Allowed 
    } 

    private void FuncRequireB(B b) 
    { 

    } 
} 

나는 우아한 해결책 클래스에서 B로 T를 정의하는 것을 알고,하지만 난 이유 "B로 t" "(B) t"를 알고 싶습니다 이 경우 다른. 나는 "as"가 안전하다는 것을 알고 있으므로 convert가 수행 될 수 없다면 null만을 생성 할 수 있고, 반면에 변환이 성공적이지 않은 경우 명시 적 형변환은 예외를 throw하지만 컴파일러는 왜 이것을 신경 써야할까요? 나는이 경우 그들 사이에 아무런 차이가 없음을 안다.

미리 감사드립니다.

+0

[C# Generics 소개] (http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx) – MethodMan

+5

'T'를 사용하면 모든 것이 더 좋지만 그 다음에는 다시, 나는 영국 출신이다. –

답변

5

차이점은 보통입니다. 컴파일러가 약 1 개를 알고 있으면 캐스트가 사용자 정의 변환을 수행 할 수 있습니다. 제네릭 형식의 경우 컴파일러에는 해당 정보가 없습니다. 당신은 그냥 직선 참조 변환 캐스트를 수행 할 경우, object 처음 캐스팅 할 수

FuncRequireB((B)(object) t); 

사용할 수있는 변환의 이러한 측면은, 나에게 매우 명확 적이있다 정직하게 -하지만이 작업을 수행 .

TB과 호환 가능하도록 제한 할 수 있다면 더 깨끗하게 처리 할 수 ​​있습니다. 유형이 특정 유형 인수에만 적용되는 경우 유형은 매우 일반적이지 않습니다.

+0

나는 당신이 옳았음에도 불구하고, 그것은 오히려 빈약 한 실천이며 나쁜 설계라고 지적 할 것이다. –

+0

@JamesRalston : 그러므로 마지막 단락. –

+0

글쎄, 나는 단지 강조하고 싶었다. 이중 캐스팅은 정적 인 유형화 된 언어가 제공하는 안전성을 상당히 악의적으로 우회하는 것입니다. 실제로 강조하고 싶습니다. 'as '는 명시 적 캐스트와는 다른 방식으로 작동합니다. 그것은 실패한 복싱 (그리고 null 참조 예외가 완전히 다른 주제입니다)에'null'를 반환하지만,이 캐스트는 매우 위험합니다. –

관련 문제