Quelles sont les règles les plus avancées nécessaires pour que votre code soit conforme à CLS?
-
22-07-2019 - |
Question
Voici un exemple spécifique qui n'est pas une réclamation CLS selon 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
C’est une interface que j’implémente avec des classes telles que DbId32, DbId64, DbIdString, etc. C'est un moyen de résumer le type de clé primaire de la base de données native en un type .Net commun.
Ce que je n’affiche pas, c’est la méthode fabrique qui instancie le type concret correct (par exemple, le nouveau DbId32 pour un type SQL Server 'int', par exemple) à partir d’un type de base de données natif.
Maintenant, disons que je vais utiliser cette interface comme suit:
Public MustOverride ReadOnly Property ID() As IDbId
VS affiche maintenant ce message d'avertissement:
Le type de fonction "ID" renvoyé n'est pas une réclamation CLS.
Je peux arrêter ces avertissements en ajoutant cet attribut à mon interface, comme suit:
<CLSCompliant(True)> _
Public Interface IDbId
...
Aucune des fonctions définies par cette interface ne semble briser les règles documentées ici . Alors, pourquoi VS affiche-t-il ces avertissements?
La solution
Je pense que cela est dû au modificateur de mot-clé MustOverride dans votre exemple. Regarde ça: Le membre 'MustOverride' non conforme à CLS n'est pas autorisé dans une classe conforme à CLS
Autres conseils
Je lance FXCop , ce qui semble toujours indiquer ce qui il faut faire une dll conforme à CLS
Utilisez le réflecteur .net pour examiner le code généré à la fois avec et sans l'attribut et voir s'il y a une différence.
Si tel est le cas, et que cela n'explique évidemment pas les différences (c'est-à-dire si la seule différence est l'attribut CLICompliant), modifiez ensuite vos questions avec les résultats, et j'aurai un autre essai ...: