Подтвердить что ты не робот

С#: ненулевые массивы не совместимы с CLS

В настоящее время я читаю Albahari С# 3.0 в двух словах и на стр. 241, говоря о индексировании массива, он говорит следующее:

Нетрадиционные массивы не CLS (Common Language Specification) -compliant

Что значит точно, для ненулевых массивов не должно быть CLS-совместимым? И какие последствия это имеет для вашего кода?

[Обновление]

Здесь - ссылка на страницу книги.

4b9b3361

Ответ 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)], но не очень важно, чтобы ваше приложение работало.