Почему целые числа без знака не соответствуют CLS?
Я начинаю думать, что спецификация типа предназначена только для производительности, а не для корректности.
Не все языки имеют понятие беззнаковых целых. Например, в VB 6 не было концепции неподписанных целых, что, как я подозреваю, привело к тому, что разработчики VB7 / 7.1 также не реализовали это решение (теперь оно реализовано в VB8).
Цитировать:
http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx
CLS был спроектирован так, чтобы быть достаточно большим, чтобы включать языковые конструкции, которые обычно нужны разработчикам, и в то же время достаточно мал, чтобы большинство языков могли его поддерживать. Кроме того, любая языковая конструкция, которая делает невозможным быструю проверку безопасности типов кода, была исключена из CLS, чтобы все CLS-совместимые языки могли создавать проверяемый код, если они захотят это сделать.
Обновление: я задумался об этом несколько лет назад, и хотя я не могу понять, почему UInt не может быть проверен на безопасность типов, я думаю, ребята из CLS должны были где-то иметь точку отсечения относительно того, что было бы базовым минимумом. количество поддерживаемых типов значений. Кроме того, когда вы думаете о более долгосрочном плане, когда все больше и больше языков переносятся в CLR, зачем заставлять их внедрять неподписанные целочисленные значения для обеспечения соответствия CLS, если вообще нет абсолютно никакой концепции?
Целые числа без знака не соответствуют CLS, потому что они не совместимы между определенными языками.
Неподписанные int не приносят вам особой пользы в реальной жизни, однако наличие более 1 типа int доставляет вам боль, поэтому многие языки используют только целые числа.
CLS-совместимость направлена на то, чтобы класс мог использоваться на многих языках…
Помните, что никто не заставляет вас быть CLS-совместимым.
Вы все еще можете использовать беззнаковые целые внутри метода или как частный метод, так как CLS ограничивает только открытый API.
Я полагаю, что часть проблемы связана с тем фактом, что целочисленные типы без знака в C должны вести себя как члены абстрактного алгебраического кольца, а не как числа [это означает, например, что если 16-разрядная целочисленная переменная без знака равна нулю , уменьшая требуетсячтобы получить 65 535, и если оно равно 65 535, то для увеличения необходимо получить ноль.] Бывают случаи, когда такое поведение чрезвычайно полезно, но числовые типы, демонстрирующие такое поведение, могут идти вразрез с духом некоторых языков. Я бы предположил, что решение об исключении неподписанных типов, вероятно, предшествует решению поддерживать как проверенные, так и непроверенные числовые контексты. Лично я хотел бы, чтобы были отдельные целочисленные типы для чисел без знака и алгебраических колец; применение унарного оператора минус к 32-разрядному числу без знака должно дать 64-разрядный результат со знаком [отрицание чего-либо, кроме нуля, приведет к отрицательному числу], но применение унарного минуса к типу кольца должно привести к аддитивной инверсии в этом кольце.
В любом случае, целые числа без знака не соответствуют CLS в том, что Microsoft решила, что языки не должны поддерживать целые числа без знака, чтобы считаться «совместимыми с CLS».