Соответствуют ли операторы или совместимые с IE интерфейсы CLS?
У меня есть файл DLL, который содержит Module
по имени Лэнгс. Внутри этого модуля у меня есть класс под названием AvailableLanguage
определение класса выглядит следующим образом:
Public Class AvailableLanguage
Implements IEquatable(Of AvailableLanguage)
Private _langID As Integer
Private _langName As String
Public ReadOnly Property LanguageID As Integer
Get
Return _langID
End Get
End Property
Public ReadOnly Property LanguageName As String
Get
Return _langName
End Get
End Property
Public Sub New(ID As Integer, Name As String)
_langID = ID
_langName = Name
End Sub
Public Overrides Function Equals(obj As Object) As Boolean
If obj Is Nothing Then Return False
Dim L1 As AvailableLanguage = CType(obj, AvailableLanguage)
Return Me.Equals1(L1)
End Function
Public Function Equals1(other As AvailableLanguage) As Boolean Implements IEquatable(Of AvailableLanguage).Equals
Return Me.LanguageID = other.LanguageID
End Function
Public Shared Operator =(Lang1 As AvailableLanguage, Lang2 As AvailableLanguage)
Return Lang1.Equals1(Lang2)
End Operator
Public Shared Operator <>(Lang1 As AvailableLanguage, Lang2 As AvailableLanguage)
Return Not Lang1.Equals1(Lang2)
End Operator
Public Overrides Function ToString() As String
Return _langName
End Function
End Class
Я использую этот класс в другой DLL, содержащей форму Windows. На данный момент моя форма Windows довольно пуста:
Public Class LanguageSettings
Public Property AvailableLanguages As List(Of Langs.AvailableLanguage)
End Class
Но тут Visual Studio 2012 Express выдает мне предупреждение:
Тип "Доступный язык" не соответствует CLS.
Из MSDN я понимаю, что некоторые типы делают класс или функцию несовместимыми с CLS, однако я не использую ни один из них, это просто целое число и строка.
Я могу скрыть предупреждение, если у меня есть атрибут соответствия CLS для True:
<CLSCompliant(True)>
Однако я не понимаю, почему этот класс не соответствует CLS.
Очевидно, это не из-за типов собственности. Итак, осталось:
- IEquatable(Of T) интерфейс
- Операторы = и <>
Который из них?
РЕДАКТИРОВАТЬ
Я удалил все функции и интерфейсы и получил точно такой же результат. Я просто создаю объект с несколькими свойствами только для чтения (типы Integer и String), и класс формы говорит мне, что AvailableLanguage не совместим с CLS.
Если я добавлю приватное поле типа AvailableLanguage в свой класс Class, предупреждение не будет отображаться:
Public Class LanguageSettings
Private L As Langs.AvailableLanguage 'No warning
Public Property AvailableLanguages As List(Of Langs.AvailableLanguage) 'Warning
End Class
Я искренне хотел бы понять, что происходит и как работает эта CLS-совместимая вещь.
1 ответ
Прочитайте документацию для ClsCompliant
атрибут снова - это не ложь / скрытие атрибута:
Если CLSCompliantAttribute не применяется к элементу программы, то по умолчанию:
Сборка не соответствует CLS.
Тип является CLS-совместимым только в том случае, если его окружающий тип или сборка является CLS-совместимым.
Член типа является CLS-совместимым, только если тип является CLS-совместимым.
Если это не относится к типу или, по крайней мере, к сборке, то предполагается несоответствие. Я считаю, что компилятор выдаст ошибку / предупредит, если вы на самом деле попытаетесь применить его к чему-то несовместимому.