Как преобразовать int в uint
У меня есть переменная int
со значением 820924
когда я пытаюсь преобразовать его так:
(uint)data[structure["MICROSECONDS"].Index]
это не работает
Это не сработает
unchecked((uint)data[structure["MICROSECONDS"].Index])
Я получаю Specified cast is not valid.
исключение.
object
хранилища данных, но во время выполнения я должен попытаться преобразовать в int
. Я почти уверен. Я напечатал значение объекта, это было 820924
, однако я не знаю, как напечатать тип объекта, но это должно быть int.
Код:
object value = data[structure["MICROSECONDS"].Index];
Console.WriteLine("xx MICROSECONDS type " + value.GetType());
Console.WriteLine("xx casting " + value);
Console.WriteLine("xx cast ok" + (uint)value);
Результат:
xx MICROSECONDS type System.Int32
xx casting 820924
Ответы
Ответ 1
Прежде всего, вы должны проверить тип своего значения. Вы можете сделать это, вызвав метод obj.GetType()
(либо в вашем коде напрямую, либо в окне Immediate).
Если это int
, вы можете сделать:
uint u = (uint) (int) obj;
Обратите внимание, что он отличается от вашего приведения, потому что он отличает до int
, а затем преобразует в uint
, когда вы пытались лить до uint
. int
нельзя отнести к uint
, поэтому вы получаете InvalidCastException
. int
может быть только преобразован в uint
. Запутать, что оба оператора конверсии и cast выглядят одинаково в коде: u = (uint) x
.
Проще, что вы можете сделать, это вызов определенного метода из класса Convert
:
uint u = Convert.ToUInt32(x);
Ответ 2
Проблема заключается в том, что int
хранится как object
. int
происходит от объекта, но uint
не выводится из int
, поэтому вы не можете использовать int
, хранящийся как object
, uint
. Сначала вы должны направить его на int
, а затем на uint
, потому что это действие действительно. Попробуйте сами:
object o = 5;//this is constant that represents int, constant for uint would be 5u
uint i = (uint)o;//throws exception
Но это работает:
object o = 5;
int i = (int)o;
uint j = (uint)i;
или
object o = 5;
uint i = (uint)(int)o; //No matter how this looks awkward
Ответ 3
Если Index является строкой или имеет числовое представление, преобразованное в строку, которую вы можете попробовать:
UInt32 microSecondsIndex;
if(Uint32.TryParse(data[structure["MICROSECONDS"].Index.ToString()],out microSecondsIndex))
{
//Do Stuff
}
else
{
//Do error handling
}
Ответ 4
Возможно, свойство Index
возвращает строку или что-то еще. Вы можете сделать следующее:
var num = Convert.ToUInt32(data[structure["MICROSECONDS"].Index]);
Convert.ToUInt32
перегружен всеми соответствующими типами, из которых можно преобразовать a uint
.