C #: ненулевые массивы не совместимы с CLS - PullRequest
10 голосов
/ 05 июня 2009

Я сейчас читаю Албахари х C # 3.0 в двух словах и на стр. 241, говоря об индексации массива, он говорит:

Массивы на ненулевой основе не являются CLS (Спецификация общего языка) -совместимый

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

[Update]

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

Ответы [ 4 ]

27 голосов
/ 05 июня 2009

CLS (Common Language Specification) закладывает основу для общего набора правил соответствия, который гарантирует, что другие языки (VB.NET, F # и т. Д.) Могут использовать сборки, которые вы создали с помощью C #. Массив, отличный от нуля, не будет совместимым, так как другие языки ожидают, что массивы будут начинаться с нуля.

Вот пример, который легче понять:

class Foo
{
    public void Bar() { }
    public void bar() { } 
}

Этот тип будет не совместимым с CLS, поскольку содержит два члена, которые различаются по имени только по типу. Как кто-то, использующий VB.NET, может различать между Bar и bar, поскольку компилятор VB.NET не учитывает регистр?

Таким образом, в основном CLS представляет собой набор таких правил, которые гарантируют взаимодействие между языками.

12 голосов
/ 05 июня 2009

Соответствие CLS в основном заключается в том, чтобы ваш код был максимально совместим с другими языками. Это включает в себя такие вещи, как отсутствие доступа к публичным членам, которые отличаются только регистром (что может привести к путанице в VB, который не зависит от регистра). См. Эту статью MSDN для получения дополнительной информации вместе с самой общей спецификацией .

2 голосов
/ 05 июня 2009

В дополнение к сказанному, ненулевые массивы существуют исключительно для облегчения перехода к существующему коду VB6 (в основном с помощью инструмента автоматической миграции), поскольку в VB6 индексация массива может начинаться с произвольного числа, а не обязательно с нуля.

Из-за проблемы соответствия CLS (и других соображений) не рекомендуется использовать их в .NET (даже при программировании на VB.NET). Кроме того, их использование довольно ограничено. Проще просто выполнить преобразование смещения, заключив массив в класс и написав соответствующий оператор доступа к индексу.

0 голосов
/ 05 августа 2009

Кроме того,

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

Но другие комментарии здесь верны при разработке универсальной библиотеки классов.

Всегда полезно использовать [assembly: CLSCompliant (true)], но это не критично для запуска вашего приложения.

...