С#: ненулевые массивы не совместимы с CLS
В настоящее время я читаю Albahari С# 3.0 в двух словах и на стр. 241, говоря о индексировании массива, он говорит следующее:
Нетрадиционные массивы не CLS (Common Language Specification) -compliant
Что значит точно, для ненулевых массивов не должно быть CLS-совместимым? И какие последствия это имеет для вашего кода?
[Обновление]
Здесь - ссылка на страницу книги.
Ответы
Ответ 1
CLS (Common Language Specification) закладывает основу для общего набора правил соответствия, который гарантирует, что другие языки (VB.NET, F # и т.д.) могут использовать сборки, которые вы создали с С#. Массив, отличный от нуля, не будет соответствовать требованиям, поскольку другие языки ожидают, что массивы будут основаны на нуле.
Вот пример, который проще понять:
class Foo
{
public void Bar() { }
public void bar() { }
}
Этот тип не будет CLS-совместимым, так как он содержит два члена, которые различаются по имени только по типу. Как кто-то, использующий VB.NET, устранит неоднозначность между Bar
и Bar
, поскольку компилятор VB.NET не чувствителен к регистру?
Таким образом, CLS представляет собой набор правил, подобных этому, чтобы гарантировать совместимость между языками.
Ответ 2
Соответствие CLS в основном заключается в том, чтобы убедиться, что ваш код настолько же совместим с другими языками, насколько это возможно. Он включает в себя такие вещи, как не раскрытие публичных членов, которые отличаются только случаем (что смущает VB, который не учитывает регистр). См. Эту статью статью MSDN для получения дополнительной информации, а также общая спецификация языка.
Ответ 3
В дополнение к тому, что было сказано, ненулевые массивы существуют исключительно для облегчения перехода на существующий код VB6 (главным образом, с помощью средства автоматической миграции), поскольку в VB6 индексирование массива может начинаться с произвольного числа, а не обязательно нуля.
Из-за проблемы соответствия CLS (и других соображений), он не рекомендуется когда-либо использовать их в .NET(даже при программировании VB.NET). Более того, их использование довольно ограничено. Легче просто выполнить сдвиг смещения, инкапсулируя массив внутри класса и записывая соответствующий оператор доступа к индексу.
Ответ 4
Кроме того,
Если ваше приложение не предназначено для работы с другими программами, так как в нем есть автономная единица, которую вы не будете продавать в качестве публичной библиотеки классов другим людям, не беспокойтесь об этом слишком много.
Но другие комментарии здесь правильны при разработке общей библиотеки классов.
Всегда рекомендуется использовать [сборка: CLSCompliant (true)], но не очень важно, чтобы ваше приложение работало.