.net 操作员或IEquatable接口CLS是否符合要求?
我有一个DLL文件,其中包含一个名为Langs的.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
模块
。在这个模块中,我有一个名为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