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