我有一个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向我发出警告,说:
Type&#39; AvailableLanguage&#39;不符合CLS。
From MSDN,我知道某些类型使类或函数不符合CLS,但是我没有使用其中的任何类型,这只是一个整数和一个字符串。
如果CLS Compliant Attribute为True,我可以隐藏警告:
<CLSCompliant(True)>
但是我不明白为什么这个类不符合CLS。
显然,这不是因为属性类型。左边是:
是哪一个?
修改
我删除了所有的功能和接口,得到了完全相同的结果。我只是创建一个具有一些只读属性的对象(类型为Integer和String),并且表单类告诉我AvailableLanguage不符合CLS。
如果我在表单类中添加了一个AvailableLanguage类型的私有字段,则不会显示警告:
Public Class LanguageSettings
Private L As Langs.AvailableLanguage 'No warning
Public Property AvailableLanguages As List(Of Langs.AvailableLanguage) 'Warning
End Class
我非常希望了解正在发生的事情以及CLS合规事项的运作方式。
答案 0 :(得分:1)
再次阅读ClsCompliant
属性的文档 - 它不是谎言/隐藏的属性:
如果没有CLSCompliantAttribute应用于程序元素,则默认情况下:
程序集不符合CLS。
只有当封闭类型或程序集符合CLS时,该类型才符合CLS。
仅当类型符合CLS时,类型的成员才符合CLS。
如果它未应用于类型,或至少应用于程序集,则假设不合规。我相信如果你真的试图将它应用于不合规的东西,编译器会报错/警告。