为什么C#不能将long var隐式转换为对象var然后转换为ulong?

    long a = 0;
    Object c = a;
    ulong b = (ulong)c; // throw exception here

#1楼 票数:7

你只能拆箱到与盒装完全相同的类型

 Object c = a

盒子a很长

 ulong b = (ulong)c;

尝试将unbox c作为ulong但是它很长并因此失败。

 ulong b = (ulong)((long)c);

会工作,因为它取消了c长。 如果长,这将起作用,你可以长期投入到ulong

#2楼 票数:5 已采纳

如果您输入值类型T,则只能将其作为自身或Nullable(T?)取消装箱。 任何其他演员表无效。

那是因为来自对象的强制转换永远不能被解释为转换,而是long和ulong之间的转换。

所以这是合法的:

var c = (long) b;

这也是合法的:

var c = (long?) b;

但这不是:

var c = (ulong) b;

要做你想做的事,你必须投两次:第一次只是拆箱,第二次是实际转换:

var c = (ulong)(long) b;

有关详细信息,请参阅Eric Lippert撰写的博客文章

#3楼 票数:1

如果该值大于long的最大值(9,223,372,036,854,775,807),则上述所有结果都会导致数据丢失。

ulong的最小值为零,最大值为18,446,744,073,709,551,615。

转换没有这种风险使用

ulong b = Convert.ToUInt64(c);

#4楼 票数:0

简短而简单的回答:因为长和ulong不是同一类型。 一个是签名长,另一个是无签名长。

  ask by ricky translate from so

未解决问题?本站智能推荐:

2回复

将char隐式转换为整数有什么好处?

只是出于好奇... 我发现了使用Char类型的讨厌的副作用,所以我想知道为什么设计师选择了类似的行为。 由于隐式转换,以下内容是有效的: 但是,以下内容使我有些困惑,因为很容易导致误解: 由于字符串由字符组成,并且字符串的“和”产生另一个字符串,为什么字符的“和”应该给出
5回复

为什么我不能将双精度隐式转换为整数?

您可以将 int 隐式转换为 double: double x = 5; 您可以显式地将 int 转换为 double: double x = (double) 5; 您可以显式地将 double 转换为 int: int x = (int) 5.0; 为什么不能将双精度隐式转换为整数? :
2回复

使用转换运算符进行C#转换

我有一个字符串类的自定义实现。 我在字符串和类之间添加了自定义转换运算符,并且转换正常工作。 但是,如果我先将自定义对象转换为System.Object,然后将其字符串化,则会显示:“无法将类型'MyString'转换为类型'System.String'”。 这是为什么? 我该如何启用.
1回复

泛型类型的C#隐式强制转换

我正在尝试理解泛型类型的隐式强制转换。 以下代码行将无法编译: 但是,如果我将以下隐式运算符添加到Section类中,则它们将进行编译。 这些行真正改变了什么? (顺便说一句:ReSharper现在显示“转换为基类”错误,但是我找不到任何有关它的信息。 有人可以向我解释
1回复

通用包装器类的隐式C#转换

我正在编写一个通用包装器类,以便为我的另一个类中的一堆属性实现INotifyPropertyChanged 。 我一直在对implicit转换运算符进行一些研究,但对于如何在泛型类中使用它感到有些困惑。 本质上,我想获取内部包装的值,而无需显式调用内部属性。 我要寻找的行为本质上是Null
2回复

用户如何定义在c#中的转换[关闭]

谁能解释以下程序,即用户如何定义转换,无论是显式还是隐式的? 另请参阅我对显式转换方法和隐式转换方法的评论。
3回复

为什么Linq Cast <>帮助程序不能与隐式强制转换运算符一起使用?

在决定重复投票之前,请仔细阅读末尾... 我有一个类型,将一个implicit cast运算符实现为另一种类型: 现在,隐式和显式强制转换就可以了: ...那么Linq的.Cast<>怎么不呢? 查看.Cast<>的源代码,并没有发生太多的魔
6回复

什么时候应该在 C# 中定义(显式或隐式)转换运算符? [关闭]

关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善