¿Cuáles son las reglas más avanzadas necesarias para que su código se convierta en reclamo de CLS?
-
22-07-2019 - |
Pregunta
Aquí hay un ejemplo específico que no es una queja CLS de acuerdo con 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
Esta es una interfaz que implemento con clases como DbId32, DbId64, DbIdString, etc. Es una forma de abstraer el tipo de clave primaria de la base de datos nativa en un tipo .Net común.
Lo que no estoy mostrando es el método de fábrica que crea instancias del tipo concreto correcto (es decir, nuevo DbId32 para un tipo de SQL Server 'int', por ejemplo) dado un tipo de base de datos nativa.
Ahora digamos que voy a usar esta interfaz así:
Public MustOverride ReadOnly Property ID() As IDbId
VS ahora muestra este mensaje de advertencia:
El tipo de retorno de la función 'ID' no es una queja CLS.
Puedo detener estas advertencias agregando este atributo a mi interfaz así:
<CLSCompliant(True)> _
Public Interface IDbId
...
Ninguna de las funciones que define esta interfaz parece romper las reglas documentadas aquí . Entonces, ¿por qué VS muestra estas advertencias?
Solución
Creo que se debe al modificador de palabras clave MustOverride en su ejemplo. Mira esto: El miembro 'MustOverride' no compatible con CLS no está permitido en una clase compatible con CLS
Otros consejos
Ejecuto FXCop y eso parece indicar siempre qué se necesita para hacer un dll compatible con CLS
Use el reflector .net para ver el código generado con y sin el atributo y ver si hay alguna diferencia.
Si existe, y obviamente no explica las diferencias (es decir, si la única diferencia es el atributo CLICompliant), modifique sus preguntas con los resultados, y tendré otra oportunidad ...:)