.net 操作员或IEquatable接口CLS是否符合要求?

.net 操作员或IEquatable接口CLS是否符合要求?,.net,vb.net,visual-studio-2012,cls-compliant,.net,Vb.net,Visual Studio 2012,Cls Compliant,我有一个DLL文件,其中包含一个名为Langs的模块。在这个模块中,我有一个名为AvailableLanguage的类,该类定义如下: Public Class AvailableLanguage Implements IEquatable(Of AvailableLanguage) Private _langID As Integer Private _langName As String Public ReadOnly Property LanguageI

我有一个DLL文件,其中包含一个名为Langs的
模块
。在这个模块中,我有一个名为
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
但就在这里,Visual Studio 2012 Express给了我一个警告,说:

类型“AvailableLanguage”不符合CLS

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

我可以隐藏警告,如果我有正确的答案:


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

再次阅读
ClsCompliant
属性的文档-它不是谎言/隐藏类型的属性:

如果没有将CLSCompliantAttribute应用于程序元素,则默认情况下:

  • 程序集不符合CLS

  • 仅当该类型的封闭类型或程序集符合CLS时,该类型才符合CLS

  • 仅当类型符合CLS时,类型的成员才符合CLS


如果它不应用于类型,或者至少不应用于程序集,则该假设是不符合的。我相信如果你真的试图将它应用于不符合要求的东西,编译器会出错/发出警告。

好的,我理解,但这不是我的第一个项目,而且这是第一次出现。@MartinVerjans-目前问题中显示的还不够-也许
LanguageSettings
正在继承(直接或间接)来自标记为
ClsCompliant(true)
的类,这是您第一次遇到这种情况?否则,很可能是您记得有人故意更改默认值。可能是在这个项目中,
ClsCompliant
属性应用于整个程序集(例如,在
AssemblyInfo.vb
文件中)而不是在您以前工作过的项目中。“它是哪一个?”-这听起来像是你可以自己回答的问题,一次删除一个成员,直到警告消失。我注意到你覆盖的是Equals,但不是GetHashCode,这可能是相关的。@JonSkeet实际上我可能会更改问题标题,但不是他们两个。我删除了除属性以外的所有内容,但仍然存在相同的问题。P巡回演出当然会有所帮助。
Public Class LanguageSettings
    Public Property AvailableLanguages As List(Of Langs.AvailableLanguage)
End Class
<CLSCompliant(True)>
Public Class LanguageSettings
    Private L As Langs.AvailableLanguage 'No warning
    Public Property AvailableLanguages As List(Of Langs.AvailableLanguage) 'Warning
End Class