2009-06-02 2 views
5

У меня есть проект .NET 3.5 C#, который имеет пространство имен SampleNamespace.Tools.Sample.Код ссылки не соответствует CLS

Если добавить сборку под названием «Samplenamespace.Utils.Example» в моем проекте я получаю следующее предупреждение:

идентификатор «Samplenamespace», отличающуюся только в случае, если это не CLS-совместимый

Обратите внимание на нижний регистр «n» в Samplenamespace.

Я даже не использую ссылку в моем проекте на данный момент. Простое добавление в качестве ссылки вызывает предупреждение.

Почему компилятор жалуется на это, учитывая, что я даже не раскрываю никаких ссылок на сборку в своих публичных классах?

Любое обходное решение?

ответ

7

Не все языки .NET чувствительны к регистру (например, VB), когда у вас смешанные пространства имен, подобные этому, только в случае (для использования формулировки предупреждения) ваш код может быть недоступен другим разработчикам.

Это может быть не ваш случай, поэтому это предупреждение (в моем магазине мы рассматриваем как ошибка)

+0

Спасибо, Ральф, я до сих пор не понимаю, почему это имеет значение, поскольку мой проект не раскрывает ничего подобного ссылочной сборке любым потенциальным клиентам VB. Я эффективно абстрагирую VB-клиент от базовой сборки? – user115909

+0

Поскольку VB не чувствителен к регистру, он не может различать SampleNamespace.A и Samplenamespace.A и, следовательно, он не может определить, какой тип вызывать. Чтобы предотвратить такую ​​неоднозначность, компилятор C# отмечает это, чтобы вы могли создавать только типы и члены, которые могут быть вызваны всеми без какой-либо двусмысленности. – Gishu

+0

Я думаю, что это слепой check-and-flag, он не рассматривает, как вы на самом деле используете или раскрываете типы. – Gishu

2

Это просто предупреждаю вас, так как не все языки, которые могут потреблять типы внутри вашего решения будет помните о различии (и не можете использовать типы).

Я думаю, что вы можете избежать этого предупреждения, пометив сборку как быть не-CLS совместимыми (в файле AssemblyInfo.cs) (read more here):

[assembly:CLSCompliant(false)] 

Не уверен, что я думаю, что это хорошая идея, хотя ...

Обновление: Я думаю, что причина, по которой предупреждение выдается, хотя ничего публично не раскрыто, заключается в том, что пространства имен не имеют модификаторов доступа. Вы могли бы сказать, что пространства имен всегда общедоступны, поэтому - это, которые доступны потенциальным клиентам, даже если они не могут содержать общедоступные типы.

+0

Fredrik, я мог бы сделать код не совместимым с CLS, но я бы предпочел не рассматривать, что какой-либо клиентский код моего приложения не подвергается этой сборке. Это не похоже на правильную ситуацию, чтобы сломать CLS-Compliance. – user115909

+0

Мне тоже было любопытно, и я сделал несколько тестов; см. мое обновление в ответе. –

+0

Это делает с Фредриком. Я полагаю, что мои единственные варианты - либо изменить пространство имен, либо установить соответствие CLS false. Спасибо за помощь – user115909

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

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