2017-04-27 18 views
-1

最初は動作していますが、2番目にエラーが表示されますが、違いは何ですか? 私はドキュメントを読んで、それについて何かを見つける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

@ TheLethalCoder var z =(A)q; ここにエラーがあります。私が見ることができるように、タイプA – GodlikeRabbit

答えて

1

ラインvar z = (A)q;を知ってほしい、これはオブジェクトqがタイプAではないことを意味し、エラーを投げています。あなたがキャストしようとしている方法は、同様にあなたは、以下のパターンのいずれかを使用する必要があり少しぎこちないです:明示的なキャスト

続い

var z = q as A; 
if (z == null) { /*the cast failed*/ } 
  • isnullチェックが続く

    • as

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

    注意してください最初のパターンは、キャストが失敗し、2番目が例外をスローする場合は、nullを返します。これは、第1のケースが「静かに」失敗するため、第2のケースでのみ例外が表示される理由です。

  • +0

    にキャストできませんでした。ジェネリックタイプをチェックしていますので、正しいタイプでなければなりません。 if(q.GetType()typeof(A)) – GodlikeRabbit

    +0

    @GodlikeRabbitはいそのようにしないで、適切な方法でそれをやってみてください。また、アプリケーションをデバッグし、 'q'が実際に何であるかを見てください。 – TheLethalCoder

    関連する問題