Quali sono le regole più avanzate necessarie affinché il tuo codice diventi un reclamo CLS?
-
22-07-2019 - |
Domanda
Ecco un esempio specifico che non è un reclamo CLS secondo VS.NET 2005.
Public Interface IDbId
Function GetNativeObject() As Object
Function Equals(ByVal compObj As IDbId) As Boolean
Function CompareTo(ByVal compObj As IDbId) As Integer
Function ToString() As String
End Interface
Questa è un'interfaccia che implemento con classi come DbId32, DbId64, DbIdString, ecc. È un modo per astrarre il tipo di chiave primaria del database nativo in un tipo .Net comune.
Quello che non sto visualizzando è il metodo factory che crea un'istanza del tipo concreto corretto (ad esempio il nuovo DbId32 per un tipo di SQL Server 'int', ad esempio) dato un tipo di database nativo.
Ora diciamo che vado a usare questa interfaccia in questo modo:
Public MustOverride ReadOnly Property ID() As IDbId
VS ora genera questo messaggio di avviso:
Il tipo di restituzione della funzione "ID" non è un reclamo CLS.
Posso interrompere questi avvisi aggiungendo questo attributo alla mia interfaccia in questo modo:
<CLSCompliant(True)> _
Public Interface IDbId
...
Nessuna delle funzioni definite da questa interfaccia sembra infrangere le regole documentate qui . Quindi perché VS visualizza questi avvisi?
Soluzione
Penso che sia dovuto al modificatore di parole chiave MustOverride nel tuo esempio. Controllalo: Un membro 'MustOverride' non conforme a CLS non è consentito in una classe conforme a CLS
Altri suggerimenti
Corro FXCop e sembra indicare sempre cosa ci vuole per fare una dll conforme a CLS
Usa il riflettore .net per dare un'occhiata al codice generato sia con che senza l'attributo, e vedi se c'è qualche differenza.
Se c'è, e ovviamente non spiega le differenze (cioè se l'unica differenza è l'attributo CLICompliant), allora modifica le tue domande con i risultati e proverò un altro ...:)