我有一个包含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 的事情是如何工作的。