Предупреждение «Массивы в качестве аргументов атрибутов несовместимы с CLS», но информация о типе не указана

При компиляции моего решения я получаю несколько предупреждений о следующем:

warning CS3016: Arrays as attribute arguments is not CLS-compliant

Никакой другой информации о том, какой тип не соответствует требованиям, не приводится. В моих проектах у меня есть некоторые атрибуты, которые принимают аргументы массива params в своих конструкторах, но все они внутренние, и это не должно влиять на CLS-совместимость. Почему выдается это предупреждение и для какого типа оно выдается?


person thecoop    schedule 28.10.2009    source источник
comment
Вы нашли простой способ найти, где было вызвано предупреждение?   -  person jamiebarrow    schedule 29.06.2011


Ответы (3)


CS3016.

Если у вас есть атрибут, который принимает массив в качестве аргумента, а проект помечен как CLSCompliant, вы получите это предупреждение.

person Darin Dimitrov    schedule 28.10.2009
comment
Но этот атрибут является внутренним для сборки и недоступен для общего доступа. Это не должно влиять на соответствие CLS. - person thecoop; 28.10.2009

Я столкнулся с этим сегодня. У меня было 4 случая появления предупреждения. Затем я обнаружил, что у меня есть атрибут, украшающий 4 общедоступных метода в этой сборке. По мере того, как я удалял их одну за другой, ошибки исчезали одна за другой.

Кроме того, если вас устраивает несовместимость с CLS, вы можете поместить [CLSCompliant(false)] в методы, украшенные атрибутом (или в класс, в котором определены методы). Помещение его в конструктор/класс оскорбительного атрибута не помогает. Я думаю, это имеет смысл, поскольку в конечном итоге атрибут, вероятно, отображается за пределами сборки как часть метаданных общедоступного метода.

person Brent    schedule 09.12.2010
comment
Кроме того, если вас устраивает несовместимость с CLS, вы можете поместить [CLSCompliant(false)] в методы, украшенные атрибутом (или в класс, в котором определены методы). Помещение его в конструктор/класс оскорбительного атрибута не помогает. Я думаю, это имеет смысл, поскольку в конечном итоге атрибут, вероятно, отображается за пределами сборки как часть метаданных общедоступного метода. - person Brent; 09.12.2010

Я столкнулся с той же проблемой, и мне нужно было использовать диалоговое окно «Найти в файлах» в VS2010, выбрать «Использовать: подстановочные знаки» и в текстовом поле «Найти что:» ввести

\[*\(*\)\]

Это создает список всех экземпляров атрибутов. Пошел один за другим, и я смог определить и исправить предупреждения.

person Mario    schedule 23.08.2012