• 締切済み

ジェネリックなメソッドでDirectCastするとエラーになるのはなぜ?

お世話になっております。 Visual Studio 2008にて開発していますが 以下のfoo1でエラーになる原因がわかりません。 foo2, foo3では問題ありませんのでDirectCastが使えないといった理由でもなさそうです。 MSDNを調べてみたのですがこれといったものは見つかりませんでした。 おそらく、何れかの仕様に違反しているのでしょうが具体的な原因について教えてもらえないでしょうか? Public Shared Function foo1(Of T As Class)(ByVal c As Control) As T Return DirectCast(c, T) End Function Public Shared Function foo2(Of T As Class)(ByVal c As Object) As T Return DirectCast(c, T) End Function Public Shared Function foo3(Of T As Class)(ByVal c As Control) As T Return TryCast(c, T) End Function

みんなの回答

  • nn1102
  • ベストアンサー率80% (12/15)
回答No.2

お世話になります。 「変換が失敗した場合、CType および DirectCast の両方から InvalidCastException エラーが発生します。これは、アプリケーションのパフォーマンスに悪影響を与える可能性があります。TryCast は、例外を処理するのではなく、返された値が Nothing かどうかをテストするだけで済むように Nothing (Visual Basic) を返します。」 と データ型 が 参照型のみ というところが違いかと思います。

参考URL:
http://msdn.microsoft.com/ja-jp/library/zyy863x8(VS.80).aspx
  • nn1102
  • ベストアンサー率80% (12/15)
回答No.1

お世話になります。 MSDN をみると 「キーワード DirectCast は、CType 関数 およびキーワード TryCast と同じ方法で使用します。1 つ目の引数に式を指定し、2 つ目の引数に変換後の型を指定します。DirectCast の場合、この 2 つの引数のデータ型の間に、継承または実装の関係があることが必要です。つまり、一方の型が他方の型を継承または実装している必要があります。 」 とのことらしいです。

参考URL:
http://msdn.microsoft.com/ja-jp/library/7k6y2h6x.aspx
tokaton2
質問者

補足

回答ありがとうございます。 foo2が良くてfoo1がだめな理由は分かりました。foo1は Public Shared Function foo1(Of T As Control)(ByVal c As Control) As T Return DirectCast(c, T) End Function このように記述しなければならないのですね。 残りのfoo3がOKな理由はなぜでしょうか? TryCastのMSDNにも参考に頂いたURLと同様の記述が見受けられるのでエラーになるのが正しいように思えますが… 「TryCast キーワードは、CType 関数 や DirectCast キーワードと同じように使用します。最初の引数は式、2 つ目の引数は変換する型です。TryCast は、クラスやインターフェイスなどの参照型のみを扱います。2 つの型の間には、継承または実装の関係が必要です。つまり、一方の型が他方を継承しているか、実装している必要があります。」

関連するQ&A