2017-07-12 1 views
1

ModuleLangsという名前のDLLファイルがあります。このモジュール内の私はAvailableLanguageというクラスを持って、クラス定義は以下の通りです:オペレータまたはIEquatableインターフェイスCLS準拠ですか?

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フォームはかなり空です:

タイプ 'AvailableLanguageは' CLSに準拠していません。

Public Class LanguageSettings 
    Public Property AvailableLanguages As List(Of Langs.AvailableLanguage) 
End Class 

しかし、すぐそこには、Visual Studioの2012のExpressは言って、私に警告をスローします。

From MSDN、私は、いくつかのタイプはクラスまたは関数ではないCLS準拠を作ることを理解ししかし私はそれらのいずれかを使用していないよ、これは単なる整数と文字列です。

私はTrueにCLS Compliant Attributeを持っていた場合、私は警告を非表示にすることができます:

<CLSCompliant(True)> 

thsiクラスは、CLSに準拠していない理由を私は理解していないが。

明らかに、それはプロパティタイプのためではありません。だから、残っている:それは1(Tの)

  • IEquatableインターフェイス
  • =と<>演算子

EDIT

私はすべての機能とインタフェースを除去し、全く同じ結果を得ました。私はいくつかの読み取り専用のプロパティ(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 

を私はhonnestlyに行くとどのようにこれが準拠事の作品をCLSているものを理解したいと思います。

+0

「どちらですか? - それは、警告が消えるまでメンバーを一度に1つずつ削除することによって、あなた自身で答えることができるように思えます。あなたはEqualsをオーバーライドしていますが、関連性のあるGetHashCodeはオーバーライドしていません。 –

+0

@JonSkeet実際に私は質問のタイトルを変更するかもしれませんが、それはどちらでもありません。私はプロパティを除くすべてを削除し、同じ問題がまだあります。 –

+0

[mcve]を指定すると確かに役立ちます。 –

答えて

1

再びClsCompliant属性のドキュメントを読む - それは、属性の種類表示/非嘘ではありません。何CLSCompliantAttributeは、デフォルトでは、その後、プログラムの要素に適用されていない場合は

を:

  • アセンブリはCLSに準拠していません。

  • タイプは、その囲みタイプまたはアセンブリがCLSに準拠している場合にのみ、CLSに準拠しています。

  • タイプのメンバは、そのタイプがCLSに準拠している場合のみ、CLSに準拠します。それはタイプ、または少なくともアセンブリへに適用されていない場合は

は、その仮定は非準拠です。私はあなたが実際にそれを非準拠のものに適用しようとすると、コンパイラはエラー/警告を発すると信じています。

+0

OK私はそれを理解していますが、それは私の最初のプロジェクトではない、そして、これは今ではじめて現れています。 –

+0

@MartinVerjans - 現時点で質問には不十分です。おそらく、 'LanguageSettings'は' ClsCompliant(true) 'と書かれたクラスから(直接的にまたは間接的に)継承しています。これはあなたが初めて遭遇したときですか?それ以外の場合は、意図的にデフォルトから変更することを忘れないでください。 –

+1

このプロジェクトでは、 'ClsCompliant'属性が(AssemblyInfo.vb'ファイルのように)アセンブリ全体に適用されているのに対し、以前に作業したプロジェクトには含まれていない可能性があります。 –

関連する問題