Почему unsigned int не соответствует требованиям CLS?

Почему целые числа без знака несовместимы с CLS?

Я начинаю думать, что спецификация типа предназначена только для производительности, а не для правильности.

Ответов (4)

Решение

Не во всех языках есть понятие целых чисел без знака. Например, VB 6 не имел концепции беззнаковых целых чисел, что, как я подозреваю, привело к решению разработчиков VB7 / 7.1 не реализовывать его (теперь это реализовано в VB8).

Цитировать:

http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx

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

Обновление: я действительно задавался вопросом об этом несколько лет назад, и хотя я не понимаю, почему UInt не может быть проверен на безопасность типов, я предполагаю, что ребятам из CLS нужно было где-то отрезать точку в отношении того, что будет базовым минимумом количество поддерживаемых типов значений. Также, когда вы думаете о более долгосрочной перспективе, когда все больше и больше языков переносятся в CLR, зачем заставлять их реализовывать беззнаковые целые числа, чтобы добиться соответствия CLS, если вообще нет никакой концепции?

Я подозреваю, что часть проблемы связана с тем фактом, что беззнаковые целочисленные типы в C должны вести себя как члены абстрактного алгебраического кольца, а не как числа [что означает, например, что если 16-разрядная целочисленная переменная без знака равна нулю , уменьшая его требуетсячтобы получить 65 535, а если оно равно 65 535, тогда требуется его приращение, чтобы получить ноль.] Бывают случаи, когда такое поведение чрезвычайно полезно, но числовые типы, демонстрирующие такое поведение, могли идти вразрез с духом некоторых языков. Я бы предположил, что решение об исключении беззнаковых типов, вероятно, предшествовало решению поддерживать как проверенные, так и непроверенные числовые контексты. Лично мне жаль, что для беззнаковых чисел и алгебраических колец не было отдельных целочисленных типов; применение унарного оператора минус к 32-битному числу без знака должно дать 64-битный результат со знаком [отрицание чего-либо, кроме нуля, даст отрицательное число], но применение унарного минуса к типу кольца должно дать аддитивный обратный результат в этом кольце.

В любом случае причина, по которой целые числа без знака не совместимы с CLS, заключается в том, что Microsoft решила, что языки не должны поддерживать целые числа без знака, чтобы считаться «совместимыми с CLS».

Целые числа без знака несовместимы с CLS, потому что они не совместимы между определенными языками.

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

Совместимость с CLS нацелена на то, чтобы можно было использовать класс из множества языков ...

Помните, что никто не заставляет вас соответствовать требованиям CLS.

Вы по-прежнему можете использовать целые числа без знака в методе или как parms для частного метода, поскольку CLS-совместимый ограничивает только общедоступный API.