DOBON.NET DOBON.NETプログラミング掲示板過去ログ

暗黙的な型変換について

環境/言語:[Windows2000Pro VisualBasic.NET Outlook2000]
分類:[.NET]

以下のようなソースです。MAPIを使用したメール受信処理です。
' Create Outlook application.
Dim oApp As Outlook.Application = New Outlook.Application()
' Get NameSpace and Logon.
Dim oNS As Outlook.NameSpace = oApp.GetNamespace("mapi")
oNS.Logon("username", "password", False, True)

' Get Appointments collection from the Calendar folder.
Dim oInBox As Outlook.MAPIFolder = oNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
Dim oItems As Outlook.Items = oInBox.Items

' Get the first AppointmentItem.
Dim oAppt As Outlook.AppointmentItem = oItems.GetFirst() ※

Option Strict Onにすると


※のoItems.GetFirst()で「Option Strict On で 'System.Object'
から 'Outlook.AppointmentItem' への暗黙的な変換はできません。」と
ビルドエラーになるのですが、初心者なもので対処方法が分かりません。
アドバイスを頂けないでしょうか?宜しくお願いします。
こんにちは、じゃんぬ です。

■No11424に返信(marumaruさんの記事)
> ※のoItems.GetFirst()で「Option Strict On で 'System.Object'
> から 'Outlook.AppointmentItem' への暗黙的な変換はできません。」と
> ビルドエラーになるのですが、初心者なもので対処方法が分かりません。
> アドバイスを頂けないでしょうか?宜しくお願いします。

(*'-')っ [DirectCast] || [CType]

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vakeydirectcast.asp

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vafctctype.asp
じゃんぬさん、お返事ありがとうございます。
以下のようにソースを変更させて下さい。

        'Outlook
        Dim oApp As Outlook.Application = New Outlook.Application()
        'Mapi NameSpace
        Dim oNS As Outlook.NameSpace = oApp.GetNamespace("mapi")
        oNS.Logon("username", "password", False, True)

        '受信トレイ
        Dim oInbox As Outlook.MAPIFolder = oNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
        Dim oItems As Outlook.Items = oInbox.Items

        '未読メールを処理します
        oItems = oItems.Restrict("[Unread] = true")

        '未読メールについてループします
        Dim oMsg As Outlook.MailItem
        Dim i As Integer

        For i = 1 To oItems.Count
            oMsg = oItems.Item(i)
            Console.WriteLine(i)
            Console.WriteLine(oMsg.Subject)         '件名
            Console.WriteLine(oMsg.ReceivedTime)    '受信日時
            Console.WriteLine(oMsg.Body)            '本文
        Next

上記のoMsg = oItems.Item(i)で先程のキャストのエラーになります。
このエラーは受信トレイにシステム管理者からの「配信不能」メールが
入っている場合に発生します。(普通のメールではエラーにならないで動作します)
その違いが分かりません。
どのメールも処理したいのでこのエラーを解決しなければいけないです。
CTypeまたはDirectCastのMSDNを見ております。
これらを使用すれば良いのですね。
ちょっと頑張ってみますが、またアドバイスを頂けたらうれしいです。
じゃんぬさんにヒントを頂きながら、まだ解決できないでいます…。
じゃんぬさんのアドバイスを参考に以下のことをテストしました。
    '未読メールについてループします
Dim oMsg As Outlook.MailItem
Dim i As Integer

For i = 1 To oItems.Count
oMsg = oItems.Item(i) ←ここでエラー
Console.WriteLine(i)
Console.WriteLine(oMsg.Subject) '件名
Console.WriteLine(oMsg.ReceivedTime) '受信日時
Console.WriteLine(oMsg.Body) '本文
Next

暗黙の変換を以下のような明示的な変換に修正してみましたが
解決できませんでした。どうしてだろう…。
「修正後」
oMsg = DirectCast(oItems.Item(i), Outlook.MailItem)
oMsg = CType(oItems.Item(i), Outlook.MailItem)

このようにやってみましたが駄目でした。
参照設定はOutlook2000を使用している為、Microsoft Outlook 9.0 Object Library
を設定していますが、10.0や11.0でないといけないのかなあ…。
どなたかアドバイスをお願いします。
■No11522に返信(marumaruさんの記事)
> じゃんぬさんのアドバイスを参考に以下のことをテストしました。
>     '未読メールについてループします
> Dim oMsg As Outlook.MailItem
> Dim i As Integer
>
> For i = 1 To oItems.Count
> oMsg = oItems.Item(i) ←ここでエラー
> Console.WriteLine(i)
> Console.WriteLine(oMsg.Subject) '件名
> Console.WriteLine(oMsg.ReceivedTime) '受信日時
> Console.WriteLine(oMsg.Body) '本文
> Next
>
> 暗黙の変換を以下のような明示的な変換に修正してみましたが
> 解決できませんでした。どうしてだろう…。
> 「修正後」
> oMsg = DirectCast(oItems.Item(i), Outlook.MailItem)
> oMsg = CType(oItems.Item(i), Outlook.MailItem)
>
> このようにやってみましたが駄目でした。
> 参照設定はOutlook2000を使用している為、Microsoft Outlook 9.0 Object Library
> を設定していますが、10.0や11.0でないといけないのかなあ…。
> どなたかアドバイスをお願いします。
あたりまえだけど、中身が適切じゃなきゃキャストミスしますよ。
まあ、エラーだけじゃわかりませんけど。
はいこーんさん、レスありがとうございます。

少し分かったことがあるのですが、
エラーが発生するのは全ての場合ではなく、
Outlook.OlObjectClass.olMail()の時は問題なく動作する
Outlook.OlObjectClass.olReport()の時にエラーになる

ことが分かりました。Outlook.OlObjectClass.olReport()は、
システム管理者からの配信不能の返信メールでした。
このメールは通常のメールと同じように処理しては駄目(いけない)
ということになるのかなあ…。
エラーが発生するコードを実行する前に上記を分岐して…
というようなことをする必要がありそうですね。
調べてみますが、またアドバイスをお願いします。

DOBON.NET | プログラミング道 | プログラミング掲示板