将接口B的实现强制转换为接口A的实现

时间:2019-03-05 12:37:20

标签: c# types interface casting type-conversion

我正在尝试使代码无法运行。我想将A类的对象强制转换为B类的对象,但是我遇到了错误。从理论上讲,A是B的一部分,所以我看不出来,为什么它不起作用。

我知道,这种转换确实意味着丢失一些数据,但这正是我想要的。 有什么办法可以使它运行?

Option Explicit
Public oOutlook As Object
Public miCalendario As Object
Public objAppointment As Outlook.AppointmentItem
Private Sub CalExport_Click()

    Const olAppointmentItem = 1
    Dim OBjapt As Outlook.Namespace
    Dim strFolderName As String
    Dim OLAppointment As Object

    Set OBjapt = oOutlook.GetNamespace("MAPI")
    Set Calendar = Session.GetDefaultFolder(olFolderCalendar).Folders("Test")
    Set objAppointment = Calendar.items.Add(olAppointmentItem)

    Call StartOutlook

    B = ThisWorkbook.Sheets(2).Range("A65536").End(xlUp).Value
    For A = 0 To B
        If A = Range("A7").Value Then
            A = B
        End If

        Set OLAppointment.Subject = (ThisWorkbook.Sheets(2).Range("A65536").End(xlUp).Offset(X, 2).Value)
        SD = ThisWorkbook.Sheets(2).Range("A65536").End(xlUp).Offset(X, 3).Value
        ST = Format(ThisWorkbook.Sheets(2).Range("A65536").End(xlUp).Offset(X, 4).Value, "hh:mm:ss")
        SDT = FormatDateTime(SD & " " & ST)
        MsgBox SDT
        OLAppointment.Start = DateValue(SDT)

        ED = ThisWorkbook.Sheets(2).Range("A65536").End(xlUp).Offset(X, 5).Value
        ET = Format(ThisWorkbook.Sheets(2).Range("A65536").End(xlUp).Offset(X, 6).Value, "hh:mm:ss")
        EDT = FormatDateTime(ED & " " & ET)
        OLAppointment.End = DateValue(EDT)

        OLAppointment.Body = (ThisWorkbook.Sheets(2).Range("A65536").End(xlUp).Offset(X, 7).Value & vbNewLine & "Expected LAIR: " & ThisWorkbook.Sheets(2).Range("A65536").End(xlUp).Offset(X, 8).Value & "%")

        OLAppointment.Save

        X = X - 1
    Next A

    Set OLAppointment = Nothing

End Sub

2 个答案:

答案 0 :(得分:2)

很明显,B不是A类型,反之亦然:

enter image description here

将B强制转换为A是不可能的。您只能强制转换为IB或IA类型。

答案 1 :(得分:1)

您可以通过多种方式解决此问题,一种是吉拉德·格林(Gilad Green)在其回答中所述的方式,也可以通过实施转换方法来实现:

        public static implicit operator A(B b)
        {
            //your code to convert from B to A
        }

        public static implicit operator B(A a)
        {
            //your code to convert from A to B
        }

由于B同时实现了IA和IB,因此除非您在此答案中实现类似代码段的内容,否则您就无法直接相互转换。