C# 将long转换为object,然后再转换为ulong
为什么C#不能隐式地将长变量转换为对象变量,然后再转换为ulongC# 将long转换为object,然后再转换为ulong,c#,casting,implicit-conversion,C#,Casting,Implicit Conversion,为什么C#不能隐式地将长变量转换为对象变量,然后再转换为ulong long a = 0; Object c = a; ulong b = (ulong)c; // throw exception here 您只能取消装箱到与装箱完全相同的类型 Object c = a 盒子a是一个很长的盒子 ulong b = (ulong)c; 尝试将c作为ulong取消装箱,但它是一个长的,因此失败 ulong b = (ulong)((long)c); 将工作,因为
long a = 0;
Object c = a;
ulong b = (ulong)c; // throw exception here
您只能取消装箱到与装箱完全相同的类型
Object c = a
盒子a是一个很长的盒子
ulong b = (ulong)c;
尝试将c作为ulong取消装箱,但它是一个长的,因此失败
ulong b = (ulong)((long)c);
将工作,因为它将c作为一个长函数解除绑定。c长的话,这就行了,你可以把长的投给ulong简短而简单的回答:因为long和ulong不是同一种类型。一个是有符号的长字符,另一个是无符号的长字符。如果您将值类型T设为框,则只能将其作为自身或可为空(T?)取消装箱。 任何其他强制转换都是无效的 这是因为来自对象的强制转换永远不能解释为转换,而转换是long和ulong之间的转换 所以这是合法的:
var c = (long) b;
这也是合法的:
var c = (long?) b;
但这不是:
var c = (ulong) b;
要执行您想执行的操作,您必须强制执行两次:第一次只是取消装箱,第二次是实际转换:
var c = (ulong)(long) b;
有关更多信息,请参见此。如果该值大于
long
的最大值(9223372036854775807),则上述所有操作都会导致数据丢失
ulong
的最小值为零,最大值为18446744073709551615
在没有这种风险的情况下转换使用
ulong b = Convert.ToUInt64(c);
您可以使用
ulong b=(ulong)(long)c
,但是(不能承受溢出和下溢)。@akton correct。我想让表达式的求值显式化,因此增加了一组()哈,谢谢你的帮助。你的链接非常有用。这正是我要找的!见这个问题: