运算符或 IEquatable 接口是否符合 CLS?

Are operators or IEquatable interface CLS Compliant?

我有一个 DLL 文件,其中包含一个名为 LangsModule。在这个模块中,我有一个名为 AvailableLanguage 的 class,class 定义如下:

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

我在另一个包含 Windows 表单的 DLL 中使用此 class。现在我的 Windows 表格是空的:

Public Class LanguageSettings
    Public Property AvailableLanguages As List(Of Langs.AvailableLanguage)
End Class

但就在那里,Visual Studio 2012 Express 向我发出警告,说:

Type 'AvailableLanguage' is not CLS Compliant.

From MSDN,我知道某些类型使 class 或函数不符合 CLS,但是我没有使用其中任何一个,这只是一个整数和一个字符串。

如果我将 CLS Compliant Attribute 设置为 True,我可以隐藏警告:

<CLSCompliant(True)>

但是我不明白为什么 class 不符合 CLS。

显然不是因为 属性 类型。所以剩下的是:

是哪一个?

编辑

我删除了所有函数和接口并得到了完全相同的结果。我只是创建了一个具有一些只读属性(类型为 Integer 和 String)的对象,并且 class 形式告诉我 AvailableLanguage 不符合 CLS。

如果我在表单 Class 中添加 AvailableLanguage 类型的私有字段,则不会显示警告:

Public Class LanguageSettings
    Private L As Langs.AvailableLanguage 'No warning
    Public Property AvailableLanguages As List(Of Langs.AvailableLanguage) 'Warning
End Class

我真诚地想了解发生了什么以及这个符合 CLS 的东西是如何工作的。

再次阅读 ClsCompliant 属性的文档 - 它不是 lie/hiding 类型的属性:

If no CLSCompliantAttribute is applied to a program element, then by default:

  • The assembly is not CLS-compliant.

  • The type is CLS-compliant only if its enclosing type or assembly is CLS-compliant.

  • The member of a type is CLS-compliant only if the type is CLS-compliant.

如果它没有应用于类型,或者至少没有应用于程序集,那么假设是不合规。我相信编译器会 error/warn 如果你真的试图将它应用到不合规的东西上。