运算符或 IEquatable 接口是否符合 CLS?
Are operators or IEquatable interface CLS Compliant?
我有一个 DLL 文件,其中包含一个名为 Langs 的 Module
。在这个模块中,我有一个名为 AvailableLanguage
的 class,class 定义如下:
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 中使用此 class。现在我的 Windows 表格是空的:
Public Class LanguageSettings
Public Property AvailableLanguages As List(Of Langs.AvailableLanguage)
End Class
但就在那里,Visual Studio 2012 Express 向我发出警告,说:
Type 'AvailableLanguage' is not CLS Compliant.
From MSDN,我知道某些类型使 class 或函数不符合 CLS,但是我没有使用其中任何一个,这只是一个整数和一个字符串。
如果我将 CLS Compliant Attribute 设置为 True,我可以隐藏警告:
<CLSCompliant(True)>
但是我不明白为什么 class 不符合 CLS。
显然不是因为 属性 类型。所以剩下的是:
- IEquatable(Of T) 接口
- = 和 <> 运算符
是哪一个?
编辑
我删除了所有函数和接口并得到了完全相同的结果。我只是创建了一个具有一些只读属性(类型为 Integer 和 String)的对象,并且 class 形式告诉我 AvailableLanguage 不符合 CLS。
如果我在表单 Class 中添加 AvailableLanguage 类型的私有字段,则不会显示警告:
Public Class LanguageSettings
Private L As Langs.AvailableLanguage 'No warning
Public Property AvailableLanguages As List(Of Langs.AvailableLanguage) 'Warning
End Class
我真诚地想了解发生了什么以及这个符合 CLS 的东西是如何工作的。
再次阅读 ClsCompliant
属性的文档 - 它不是 lie/hiding 类型的属性:
If no CLSCompliantAttribute is applied to a program element, then by default:
The assembly is not CLS-compliant.
The type is CLS-compliant only if its enclosing type or assembly is CLS-compliant.
The member of a type is CLS-compliant only if the type is CLS-compliant.
如果它没有应用于类型,或者至少没有应用于程序集,那么假设是不合规。我相信编译器会 error/warn 如果你真的试图将它应用到不合规的东西上。
我有一个 DLL 文件,其中包含一个名为 Langs 的 Module
。在这个模块中,我有一个名为 AvailableLanguage
的 class,class 定义如下:
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 中使用此 class。现在我的 Windows 表格是空的:
Public Class LanguageSettings
Public Property AvailableLanguages As List(Of Langs.AvailableLanguage)
End Class
但就在那里,Visual Studio 2012 Express 向我发出警告,说:
Type 'AvailableLanguage' is not CLS Compliant.
From MSDN,我知道某些类型使 class 或函数不符合 CLS,但是我没有使用其中任何一个,这只是一个整数和一个字符串。
如果我将 CLS Compliant Attribute 设置为 True,我可以隐藏警告:
<CLSCompliant(True)>
但是我不明白为什么 class 不符合 CLS。
显然不是因为 属性 类型。所以剩下的是:
- IEquatable(Of T) 接口
- = 和 <> 运算符
是哪一个?
编辑
我删除了所有函数和接口并得到了完全相同的结果。我只是创建了一个具有一些只读属性(类型为 Integer 和 String)的对象,并且 class 形式告诉我 AvailableLanguage 不符合 CLS。
如果我在表单 Class 中添加 AvailableLanguage 类型的私有字段,则不会显示警告:
Public Class LanguageSettings
Private L As Langs.AvailableLanguage 'No warning
Public Property AvailableLanguages As List(Of Langs.AvailableLanguage) 'Warning
End Class
我真诚地想了解发生了什么以及这个符合 CLS 的东西是如何工作的。
再次阅读 ClsCompliant
属性的文档 - 它不是 lie/hiding 类型的属性:
If no CLSCompliantAttribute is applied to a program element, then by default:
The assembly is not CLS-compliant.
The type is CLS-compliant only if its enclosing type or assembly is CLS-compliant.
The member of a type is CLS-compliant only if the type is CLS-compliant.
如果它没有应用于类型,或者至少没有应用于程序集,那么假设是不合规。我相信编译器会 error/warn 如果你真的试图将它应用到不合规的东西上。