1

我有一个包含Module名为Langs的 DLL 文件。在这个模块里面我有一个类叫做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 向我发出警告,说:

类型“AvailableLanguage”不符合 CLS。

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

如果我将CLS 兼容属性设置为 True,我可以隐藏警告:

<CLSCompliant(True)>

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

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

  • IEquatable(Of T) 接口
  • = 和 <> 运算符

哪一个 ?

编辑

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

如果我在表单类中添加了可用语言类型的私有字段,则不会显示警告:

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

老实说,我很想了解发生了什么以及这个符合 CLS 的事情是如何工作的。

4

1 回答 1

1

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

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

  • 该程序集不符合 CLS。

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

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

如果它不适用于类型,或者至少不适用于程序集,那么假设是non-compliance。我相信如果您实际上尝试将其应用于不合规的东西,编译器会出错/警告。

于 2017-07-12T10:55:17.887 回答