35

当我尝试像这样转换它时,我有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
4

4 回答 4

53

首先,您应该检查值的类型。您可以通过调用obj.GetType()方法(直接在代码中或在即时窗口中)来完成。

如果是,int那么你可以这样做:

uint u = (uint) (int) obj;

请注意,它与您的演员表不同,因为它您尝试转换为时转换为int然后转换为. 不能被施放,这就是为什么你得到. 只能转换为. 转换强制转换运算符在代码中看起来相同令人困惑: .uintuintintuintInvalidCastExceptionintuintu = (uint) x

Convert您可以做的更简单的事情是从类中调用特定方法:

uint u = Convert.ToUInt32(x);
于 2012-11-08T14:19:14.727 回答
9

问题是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 
于 2012-11-08T14:20:59.743 回答
1

Index属性可能正在返回一个字符串或其他东西。您可以执行以下操作:

var num = Convert.ToUInt32(data[structure["MICROSECONDS"].Index]);

Convert.ToUInt32重载了所有uint可以转换 a 的相关类型。

于 2012-11-08T14:14:35.977 回答
1

如果 Index 是一个字符串,或者在转换为字符串时具有类似数字的表示,您可以尝试:

UInt32 microSecondsIndex;
if(Uint32.TryParse(data[structure["MICROSECONDS"].Index.ToString()],out microSecondsIndex))
{
   //Do Stuff
}
else
{
    //Do error handling
}
于 2012-11-08T14:19:00.063 回答