Соответствуют ли операторы или совместимые с 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-совместимым.

Если это не относится к типу или, по крайней мере, к сборке, то предполагается несоответствие. Я считаю, что компилятор выдаст ошибку / предупредит, если вы на самом деле попытаетесь применить его к чему-то несовместимому.

Другие вопросы по тегам