Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将long转换为object,然后再转换为ulong_C#_Casting_Implicit Conversion - Fatal编程技术网

C# 将long转换为object,然后再转换为ulong

C# 将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); 将工作,因为

为什么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);

将工作,因为它将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。我想让表达式的求值显式化,因此增加了一组()哈,谢谢你的帮助。你的链接非常有用。这正是我要找的!见这个问题: