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

Почему .NET Framework не использует неподписанные типы данных?

Возможный дубликат:
Почему Array.Length является int, а не uint

Есть ли причина, по которой .NET Framework не использует неподписанные типы данных?

Не следует ли использовать их в моем коде, но, например, свойство Count List < > является int. У вас нет отрицательного счета, так почему бы его не определить как uint? Должен ли я использовать только int, хотя я знаю, что счетчик не может быть отрицательным?

4b9b3361

Ответ 1

Неподписанные числовые типы не совместимы с CLS, поэтому они не должны использоваться ни для какого API, особенно для .NET framework.

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

Ответ 2

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

Для обоснования этого решения, в конечном счете, вам придется обратиться к Microsoft. Я бы предположил, что Эрик Липперт мог перезвонить здесь с более подробным объяснением.

Это сводится к следующим фактам:

  • Вы не можете (или, по крайней мере, нет) иметь неявное преобразование между int и uint, что означает, что преобразования должны выполняться явно с использованием синтаксиса cast
  • Лучше избегать ненужного синтаксиса кастинга, если он не добавляет читаемости кода
  • Верхние границы int достаточны для большинства чисел, с которыми мы имеем дело в коде

Объединение этих элементов означает, что тип int служит в большинстве случаев.

Ответ 3

Неподписанные номера не совместимы с CLS, потому что существуют языки, которые не поддерживают эти типы. Я говорю по исправлению, но VB.NET не поддерживает неподписанные типы. Это означает, что если вы объявляете открытый член как неподписанный тип, то ваша сборка не может использоваться с VB.NET или любого другого языка .NET, который не поддерживает неподписанные типы.

Ответ 4

Некоторые языки, поддерживающие .NET, позволяют использовать unsigned ints. Например. в С# вы можете использовать uint.

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

Итак, вкратце... Не стесняйтесь использовать их, но держите их в своих классах, используя либо частные, либо внутренние ключевые слова.