Quando disattivare Option Strict? O come gestire l'ereditarietà di COM utilizzando Option Strict?

2

Sto provando a sviluppare un componente aggiuntivo per un'applicazione utilizzando la sua API e ho attivato Option Strict. Cercando di lavorare con questi oggetti COM sta causando più problemi di compilazione dicendo

Option Strict On disallows implicit conversions from 'typeA' to 'typeB'.

Attualmente sto superando il problema usando DirectCast, il che significa che devo definire il tipo in più punti, il che rende il futuro tipo di manutenzione del codice di sucky.

Un semplice esempio è:

Dim templateMgr As IEdmTemplateMgr5 = TheVault.CreateUtility(EdmUtility.EdmUtil_TemplateMgr)

CreateUtility metodo restituisce un oggetto che implementa l'interfaccia specificata dall'argomento (l'argomento è un Valore di EdmUtility Enum ).

Il ritorno è specificato al momento della compilazione come System.Object , quindi è necessario eseguire il cast del tipo giusto per poterlo utilizzare.

Con l'opzione strict on non posso farlo implicitamente, quindi ho usato DirectCast così:

Dim templateMgr As IEdmTemplateMgr5 = DirectCast(TheVault.CreateUtility(EdmUtility.EdmUtil_TemplateMgr), IEdmTemplateMgr5)

Ci sono molti, molti, molti (che molti!) membri COM che usano membri generici che rendono il compilatore molto insoddisfatto di Option Strict attivato.

Non mi piace particolarmente usare DirectCast() perché significa dichiarare il tipo in più posti sparsi per tutto il codice.

È un caso in cui è meglio disattivare solo Option Strict ??

Mi sembra che ci debba essere un modo migliore!

MODIFICA 1

Le mie opzioni di compilazione sono:

  • Opzione esplicita = ON
  • Option Strict = ON
  • Opzione Inferiore = ON
  • Opzione Confronta = Testo
  • CPU di destinazione = AnyCPU

MODIFICA 2

Ecco un altro esempio che non si limita a creare una nuova istanza di oggetto. In questo esempio sto usando un ciclo per ottenere informazioni su tutti gli oggetti in una matrice restituita da un'altra funzione.

Il ritorno da Data.Get è sempre di tipo System.Object che di nuovo fa sì che il compilatore risponda che la conversione implicita dal tipo "Oggetto" al tipo "String" non è consentita con Option Strict on.

Dim DataReturn As System.Array
Dim refreshFlag As Long
Try
    refreshFlag = TheTemplate.RunEx(TheCommand.mlParentWnd, TheVault.RootFolderID, DataReturn)

    If Not DataReturn.IsAllocated Then Throw New Exception("Nothing was created by the template.")

    'Refresh the folder view if required
    If refreshFlag = EdmRefreshFlag.EdmRefresh_FileList Then TheVault.RefreshFolder(TheVault.RootFolderPath)

    'Return the path(s) of the newly created file(s)
    Dim path As String = String.Empty
    For Each data As EdmData In DataReturn
        Select Case data.Type
            Case EdmDataType.EdmData_File
                path = DirectCast(data.Get(EdmDataPropertyType.EdmProp_Path), System.String)
                If path.Length > 0 Then CreatedFilesPaths.Add(path)
                path = String.Empty
        End Select
    Next
    
posta CBRF23 30.06.2015 - 21:41
fonte

2 risposte

3

Affrontare gli oggetti COM è quasi il motivo canonico per disattivare Option Strict o utilizzare la dinamica equivalente C #.

Il binding tardivo significa che perdi l'aiuto del compilatore per sistemare le cose, se stai combattendo il compilatore più di quanto non ti stia aiutando, è abbastanza ragionevole dire "So quello che sto facendo".

Suggerirei di isolare queste funzioni in un file separato e lasciare l'opzione rigorosa su tutto il resto.

    
risposta data 17.07.2015 - 17:55
fonte
0

Dato che stai usando Option Infer On, potresti creare alcuni metodi di estensione generici per gestire la tua situazione.

Module EX
   <Extension()> _
   Public Function CreateInstance(Of T)(ByVal Vault7Instance As IEdmVault7, ByVal typ As EdmUtility) As T
      Return DirectCast(Vault7Instance.CreateUtility(typ), T)
   End Function
End Module

quindi istanzia qualcosa del tipo:

Dim templateMgr = TheVault.CreateInstance(Of IEdmTemplateMgr5)(EdmUtility.EdmUtil_TemplateMgr)
    
risposta data 30.06.2015 - 22:17
fonte

Leggi altre domande sui tag