Неочевидное преобразование типов: x = (x + xstep <xmax? X + xstep: xmax) - PullRequest
1 голос
/ 25 февраля 2012

с учетом следующего кода:

    byte x, xmin, xmax, xstep;
    x = (x + xstep < xmax ? x + xstep : xmax)

компилятор говорит мне

Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?) 

Где происходит преобразование из байта в int? И почему?

Ответы [ 3 ]

7 голосов
/ 25 февраля 2012

Разбей это. У нас есть

sum = expression

Сумма имеет тип байта. Какой тип выражения? Сломай. Выражение

summand1 + summand2

Summand1 имеет тип байта. Какой тип является summand2? Сломай. Это:

test ? consequence : alternative

Тест относится к типу bool. Альтернатива имеет тип байта. Какой тип является следствием? Сломай! Это:

summand3 + summand4

Это байт + байт. Байт + байт - это int, поэтому следствие имеет тип int.

Теперь у нас достаточно информации для определения типа summand2. Следствием является int, альтернативой является байт, и int является более общим из этих двух типов. (Поскольку каждый байт конвертируется в int, но не каждый int конвертируется в байт.)

Следовательно, тип summand2 является int. Таким образом, у нас есть сумма, равная байту плюс int. Байт плюс int - это int, и поэтому мы присвоили int байту. Это явное преобразование, а не неявное преобразование.

6 голосов
/ 25 февраля 2012

Добавление byte к byte приводит к int, в соответствии с MSDN :

Рассмотрим, например, следующие две байтовые переменныеx и y:

    byte x = 10, y = 20;

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

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

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

    // OK: explicit conversion:
    byte z = (byte)(x + y);
0 голосов
/ 25 февраля 2012

Будет ли это работать?

byte x, xmin, xmax, xstep;
// assign your variables x, xmin, xmax, and xstep,
// then...
x = ((x + xstep) < xmax) ? (byte)(x + xstep) : xmax;

Вам нужно только разыграть эту одну часть, вероятно, потому что может превысить byte размер, но я не знаю.

... или действительно волнует почему.:)

Согласно TJ, добавление byte к byte приводит к int, поэтому я думаю, что это реальный ответ.

Но моя версия компилируется сникаких претензий только к одному исполнителю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...