Какие более сложные правила необходимы для того, чтобы ваш код стал жалобой CLS?

Вот конкретный пример, который не является жалобой на CLS согласно VS.NET 2005.

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 для типа «int» SQL Server) с учетом собственного типа базы данных.

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

Public MustOverride ReadOnly Property ID() As IDbId

VS теперь выводит это предупреждающее сообщение:

Тип возврата функции «ID» не является жалобой на CLS.

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

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

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


person Chad Braun-Duin    schedule 01.12.2008    source источник
comment
Вау, всем хороших ответов. Я попробую все эти предложения.   -  person Chad Braun-Duin    schedule 02.12.2008


Ответы (3)


Я думаю, это связано с модификатором ключевого слова MustOverride в вашем примере. Проверьте это: Несовместимый с CLS член MustOverride не допускается в CLS-совместимый класс

person Scott Ferguson    schedule 01.12.2008

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

person Community    schedule 02.12.2008

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

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

person Andrew Rollings    schedule 01.12.2008