重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になっております。
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

A 回答 (2件)

お世話になります。



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

データ型 が 参照型のみ というところが違いかと思います。

参考URL:http://msdn.microsoft.com/ja-jp/library/zyy863x8 …
    • good
    • 0

お世話になります。



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

参考URL:http://msdn.microsoft.com/ja-jp/library/7k6y2h6x …

この回答への補足

回答ありがとうございます。
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 つの型の間には、継承または実装の関係が必要です。つまり、一方の型が他方を継承しているか、実装している必要があります。」

補足日時:2010/02/22 12:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!