Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Chad Braun-DuinОтветов: 3

Вот конкретный пример, который не является жалобой на 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 отображает эти предупреждения?

  • Вау, всем хороших ответов. Я попробую все эти предложения. Chad Braun-Duin 02.12.2008

visual-studiocls-compliant

Ответы

Ответ 1 · рейтинг 3 · Scott Ferguson

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

Ответ 2 · рейтинг 2 · Community

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

Ответ 3 · рейтинг 1 · Andrew Rollings

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы