2008-12-01 2 views
3

Вот конкретный пример, который не является CLS-жалобы в соответствии с 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 и т.д. Это способ абстрактный тип первичного ключа базы данных в один общий тип .Net.

То, что я не показываю, является фабричным методом, который задает правильный конкретный тип (например, новый DbId32 для типа SQL Server «int», например), учитывая собственный тип базы данных.

Теперь, скажем, я иду, чтобы использовать этот интерфейс, например, так:

Public MustOverride ReadOnly Property ID() As IDbId 

VS Теперь выводит это предупреждение:

Возврат тип функции «ID» не CLS-жалобы.

Я могу остановить эти предупреждения путем добавления этого атрибута к моему интерфейса следующим образом:

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

Ни одна из функций Этот интерфейс определяет, как представляется, нарушают правила документированы here. Итак, почему VS отображает эти предупреждения?

+0

Вау, хорошие ответы все. Я дам все эти предложения попробовать. – 2008-12-02 00:48:41

ответ

1

Используйте рефлектор .net, чтобы взглянуть на сгенерированный код как с атрибутом, так и без него, и посмотреть, есть ли разница.

Если есть, и это явно не объясняет различия (т. Е. Если единственное отличие - это атрибут CLICompliant), то измените свои вопросы с выводами, и у меня будет еще один ... :)

2

Я бегу FXCop и что, кажется, всегда указывают на то, что нужно, чтобы сделать DLL CLS-совместимый

 Смежные вопросы

  • Нет связанных вопросов^_^