3

VS.NET 2005 によると、CLS 準拠ではない特定の例を次に示します。

Public Interface IDbId

    Function GetNativeObject() As Object
    Function Equals(ByVal compObj As IDbId) As Boolean
    Function CompareTo(ByVal compObj As IDbId) As Integer
    Function ToString() As String

End Interface

これは、DbId32、DbId64、DbIdString などのクラスで実装するインターフェイスです。これは、ネイティブ データベースの主キー タイプを 1 つの共通の .Net タイプに抽象化する方法です。

私が表示していないのは、ネイティブ データベース タイプを指定して正しい具体的なタイプ (たとえば、SQL Server タイプ 'int' の新しい DbId32) をインスタンス化するファクトリ メソッドです。

このインターフェイスを次のように使用するとします。

Public MustOverride ReadOnly Property ID() As IDbId

VS は次の警告メッセージを出力するようになりました。

関数 'ID' の戻り型は CLS 準拠ではありません。

次のように、この属性をインターフェイスに追加することで、これらの警告を停止できます。

<CLSCompliant(True)> _
  Public Interface IDbId
  ...

このインターフェイスが定義する関数はどれも、ここに記載されている規則に違反しているようには見えません。では、VS がこれらの警告を表示するのはなぜですか?

4

3 に答える 3

3

あなたの例の MustOverride キーワード修飾子が原因だと思います。これを確認してください: 非 CLS 準拠の 'MustOverride' メンバーは、CLS 準拠のクラスでは許可されていません

于 2008-12-01T22:58:03.547 に答える
2

FXCopを実行すると、DLL を CLS 準拠にするために必要なことを常に指摘しているようです。

于 2008-12-02T00:02:28.910 に答える
1

.net Reflector を使用して、生成されたコードを属性のある場合とない場合の両方で調べ、違いがあるかどうかを確認します。

存在し、違いが明確に説明されていない場合 (つまり、唯一の違いが CLICompliant 属性である場合)、調査結果で質問を修正してください。もう一度やり直します... :)

于 2008-12-01T22:56:32.333 に答える