2017-04-27 2 views
-1

첫 번째 오류는 작동하지만 두 번째 오류는 보여 주지만 차이점은 무엇입니까? 나는 문서를 읽고, 그것에 대해 아무것도 찾을 didnt는, 그렇게 중요하지 만 ​​일부 기능C에서 명시 적 변환과 안전한 캐스팅의 차이점 #

public static string GetConcat2<T>(T q) 
    { 
     if(q.GetType() == typeof(A)) 
     { 
      var z = q as A; 
     } 
     if (q.GetType() == typeof(A)) 
     { 
      var z = (A)q; 
     } 
     return "!!!!"; 
    } 
public interface CustomInteface 
{ 
    string InterfaceProperty1 { get; set; } 
    string InterfaceProperty2 { get; set; } 
    string Concat(); 
} 
public class A : CustomInteface 
{ 
    public string InterfaceProperty1 { get; set; } 
    public string InterfaceProperty2 { get; set; } 
    public string Concat() { 
     return InterfaceProperty1 + InterfaceProperty2; 
    } 
} 
+0

오류 란 무엇입니까? 오류는 어디에서 발생합니까? 문제를 재현하는 데 필요한 모든 정보와 코드를 제공하려고 시도하십시오. [MCVE]를 포함하십시오. – TheLethalCoder

+0

@ TheethalCoder var z = (A) q; 예 여기가 유, 내가 제네릭 형식을 확인하고 있습니다 볼 수 있습니다 같이 – GodlikeRabbit

답변

1

var z = (A)q;이 객체 q 유형 A이 아닌 것을 의미 오류를 던지고 줄을 알고 싶어요. 명시 적 캐스트

에 의해

var z = q as A; 
if (z == null) { /*the cast failed*/ } 
  • is을 따라 :

    • asnull 체크 다음 : 당신이 캐스팅하려고하는 방법은 물론 어색한 조금 다음 패턴 중 하나를 사용해야입니다

      if (q is A) 
      { 
          var z = (A)q; 
      } 
      

    f irst 패턴은 캐스트가 실패하고 두 번째 예외가 발생하면 null을 반환합니다. 이 때문에 첫 번째 예외가 "자동으로"실패하는 두 번째 경우에만 예외가 표시됩니다.

  • +0

    을 입력 캐스팅을 couldnt, 오류, 그래서 경우는 (q.GetType() == 대해서 typeof (A)) – GodlikeRabbit

    +0

    @GodlikeRabbit 올바른 유형 해야합니다 그런 식으로하지 마십시오. 올바른 방법으로 시도하십시오. 또한 응용 프로그램을 디버그하고'q'가 실제로 무엇인지 확인하십시오. – TheLethalCoder