【问题标题】:Are operators or IEquatable interface CLS Compliant?运算符或 IEquatable 接口是否符合 CLS?
【发布时间】:2017-07-12 10:03:34
【问题描述】:

我有一个 DLL 文件,其中包含一个名为 LangsModule。在这个模块里面我有一个叫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


【解决方案1】:

再次阅读ClsCompliant 属性的文档 - 这不是一种谎言/隐藏属性:

如果没有 CLSCompliantAttribute 应用于程序元素,则默认情况下:

  • 程序集不符合 CLS。

  • 仅当其封闭类型或程序集符合 CLS 时,该类型才符合 CLS。

  • 仅当类型符合 CLS 时,类型的成员才符合 CLS。

如果它没有应用于类型,或者至少没有应用于程序集,那么假设是不合规。我相信如果你真的尝试将它应用到不合规的东西上,编译器会出错/警告。

【讨论】:

  • 好的,我明白,但这不是我的第一个项目,而且这是第一次出现。
  • @MartinVerjans - 目前问题中显示的内容不够多 - 也许LanguageSettings 正在(直接或间接)从标记为ClsCompliant(true) 的类继承,这是您第一次遇到这种情况?否则,它更有可能是你记得故意改变默认值的东西。
  • 可能是在这个项目中,ClsCompliant 属性应用于整个程序集(例如在AssemblyInfo.vb 文件中),而在您以前工作过的项目中却没有。
猜你喜欢
  • 2014-04-20
  • 1970-01-01
  • 2011-09-30
  • 2012-02-08
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
相关资源
最近更新 更多