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

时间:2017-07-12 10:03:34

标签: .net vb.net visual-studio-2012 cls-compliant

我有一个DLL文件,其中包含名为 Langs 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

我在另一个包含Windows窗体的DLL中使用此类。现在我的Windows窗体很空:

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

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

  

Type&#39; AvailableLanguage&#39;不符合CLS。

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

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

<CLSCompliant(True)>

但是我不明白为什么这个类不符合CLS。

显然,这不是因为属性类型。左边是:

  • IEquatable(Of T)接口
  • =和&lt;&gt;运营商

是哪一个?

修改

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

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

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

我非常希望了解正在发生的事情以及CLS合规事项的运作方式。

1 个答案:

答案 0 :(得分:1)

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

  

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

     
      
  • 程序集不符合CLS。

  •   
  • 只有当封闭类型或程序集符合CLS时,该类型才符合CLS。

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

  •   

如果它未应用于类型,或至少应用于程序集,则假设不合规。我相信如果你真的试图将它应用于不合规的东西,编译器会报错/警告。