Почему C # выбрасывает ошибки при попытке выполнить математические операции над целочисленными типами, кроме int? - PullRequest
5 голосов
/ 21 июля 2010

Рассмотрим этот класс статического теста:

public static class Test
{
    public static ushort sum(ushort value1, ushort value2)
    {
        return value1 + value2
    }
}

Это приводит к следующей ошибке компиляции с value1 + value2, подчеркнутым красным:

Невозможно неявно преобразовать тип 'int' в'USHORT.Существует явное преобразование (вы пропустили приведение)?

Почему?

Ответы [ 4 ]

7 голосов
/ 21 июля 2010

Как и C и C ++ до него, целые числа неявно расширяются при использовании со многими операторами. В этом случае результат сложения двух значений ushort составляет int.

Обновление:

Дополнительная информация: http://msdn.microsoft.com/en-us/library/aa691330(v=VS.71).aspx

Я полагаю, что это было первоначально добавлено в C / C ++, потому что int был собственным целочисленным типом (и да, операции были быстрее на int с, чем на short с на 32-битных архитектурах). Я не уверен в полном обосновании C #.

Это заставляет задуматься о вопросах переполнения / усечения при приведении. Случайное переполнение более вероятно при меньших целочисленных типах.

5 голосов
/ 21 июля 2010

ushort

Следующий оператор присваивания вызовет ошибку компиляции, поскольку арифметическое выражение в правой части оператора присваивания по умолчанию оценивается как int.

ushort z = x + y;   // Error: conversion from int to ushort

Чтобы решить эту проблему, используйте приведение:

ushort z = (ushort)(x + y);   // OK: explicit conversion
2 голосов
/ 21 июля 2010

Доступные операторы сложения в C # предназначены только для типов данных int, uint, long и ulong, поэтому в этом случае вы неявно приводите два экземпляра ushort к int, затем выполняете сложениеи затем возвращает int, который не может быть неявно приведен к ushort.

Из спецификации C # 4.0, раздел 7.8.4 Оператор сложения , вы можете проверить, что только следующееДоступны целочисленные операторы сложения:

int operator +(int x, int y);
uint operator +(uint x, uint y);
long operator +(long x, long y);
ulong operator +(ulong x, ulong y);

В том же разделе также указано:

Операнды преобразуются в типы параметров выбранного оператора, а тип результата -тип возврата оператора.

Что объясняет, почему это выражение приводит к int.

1 голос
/ 21 июля 2010

Это потому, что сложение или вычитание ushorts не обязательно приводит к ushort. Например, результат может быть <0, что не является коротким. Таким образом, вам нужно дать компилятору подсказку не жаловаться на приведение типа. Я считаю, что это должно работать: return (ushort) (value1 + value2); </p>

...