【发布时间】:2017-07-12 10:03:34
【问题描述】:
我有一个 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 向我发出警告,说:
“AvailableLanguage”类型不符合 CLS。
From MSDN,我知道某些类型使类或函数不符合 CLS,但是我没有使用其中任何一个,这只是一个整数和一个字符串。
如果我将 CLS Compliant Attribute 设为 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 标准的东西是如何工作的。
【问题讨论】:
-
"是哪一个?" - 这听起来像是你可以自己回答的问题,一次删除一个成员,直到警告消失。我注意到您正在覆盖 Equals 但不是 GetHashCode,这可能是相关的。
-
@JonSkeet 实际上我可能会更改问题标题,它们都不是。我删除了除属性之外的所有内容,但仍然存在相同的问题。
-
提供minimal reproducible example 肯定会有所帮助。
标签: .net vb.net visual-studio-2012 cls-compliant