Почему неподписанные типы CLR настолько трудно использовать в C#?

Я произошел из среды главным образом C/C++, прежде чем я начал использовать C#. Одна из вещей, которые я сделал со своим первым проектом в C#, была, делают класс как это

class Element{
  public uint Size;
  public ulong BigThing;
}

Я был затем умерщвлен тем, что это требует кастинга:

int x=MyElement.Size;

как делает

int x=5;
uint total=MyElement.Size+x;

Почему разработчики языка решали сделать целое число со знаком и типы беззнаковых целых чисел не неявно castable? И почему неподписанные типы не используются больше всюду по библиотеке .NET? Например, String.Length никогда не может быть отрицательным, все же это - целое число со знаком.

9
задан Earlz 15 July 2010 в 20:56
поделиться

5 ответов

Наряду с ответом Джона то, что число без знака не может быть отрицательным, не означает, что оно не больше числа со знаком. uint составляет от 0 до 4 294 967 295, но int составляет от -2 147 483 648 до 2 147 483 647. Много места выше максимума int для потерь.

4
ответ дан 4 December 2019 в 08:50
поделиться

Почему разработчики языка решили не использовать знаковые и беззнаковые целочисленные типы. неявно приведенный?

Потому что это может привести к потере данных или возникновению исключения, что обычно не рекомендуется разрешать неявно. (Неявное преобразование long в double, по общему признанию, тоже может привести к потере данных, но по-другому.)

И почему беззнаковые типы больше не используются в библиотеке .Net

Беззнаковые типы несовместимы с CLS - не все языки .NET всегда поддерживали их. Например, в Visual Basic не было «встроенной» поддержки беззнаковых типов данных в .NET 1.0 и 1.1; он был добавлен в язык для 2.0. (Вы все еще можете использовать их, но они не были частью самого языка - например, вы не могли использовать обычные арифметические операторы.)

18
ответ дан 4 December 2019 в 08:50
поделиться

Потому что неявное преобразование беззнакового целого числа 3B в знаковое целое число приведет к взрыву.

Беззнаковое значение вдвое превышает максимальное значение подписанного. По той же причине вы не можете преобразовать long в int.

1
ответ дан 4 December 2019 в 08:50
поделиться

По второму пункту: потому что они хотели, чтобы CLR был совместим с языками, в которых нет беззнаковых типов данных (читай: VB.NET).

0
ответ дан 4 December 2019 в 08:50
поделиться

Затем я был убит тем фактом, что это требует кастинга:

 int x=MyElement.Size;

Но здесь вы противоречите сами себе. Если вам действительно (очень) нужно, чтобы Size был беззнаковым, то присваивать его (знаковому) x - это ошибка. Глубокий изъян в вашем коде.

Например, String.Length никогда не может быть отрицательной, и все же это знаковое целое число

Но String.IndexOf может вернуть отрицательное число, и было бы неудобно, если бы значения String.Length и Index были разных типов.

И хотя в теории есть смысл в беззнаковой String.Length (ограничение в 4 ГБ), на практике даже текущие 2 ГБ достаточно велики (потому что строки такой длины все равно редки и неработоспособны).

Так что реальный ответ таков: Зачем вообще использовать unsigned?

1
ответ дан 4 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: