问题标签 [boxing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
3236 浏览

c# - 投射到界面是拳击转换吗?

我有一个接口 IEntity

我有一个 Employee 类,它实现了这个接口

现在,如果我有以下代码

如果不是拳击转换,那么演员阵容如何工作?

0 投票
7 回答
40654 浏览

java - 为什么在 Java 中比较 Integer 和 int 会抛出 NullPointerException?

观察这种情况让我很困惑:

因此,正如我认为首先执行装箱操作(即 java 尝试从中提取 int 值null)并且比较操作具有较低的优先级,这就是引发异常的原因。

问题是:为什么在Java中以这种方式实现?为什么拳击比比较参考具有更高的优先级?或者为什么他们没有null在拳击前实施验证?

目前,当NullPointerException使用包装的原语抛出而不是使用真正的对象类型抛出时,它看起来不一致。

0 投票
5 回答
773 浏览

c# - 装箱和拆箱,为什么输出都不是“System.Object”?

我得到以下代码:

输出是:

为什么不是他们俩System.Object

0 投票
3 回答
296 浏览

.net - 通用约束是否应该优于使用接口作为参数类型?

考虑这个微不足道的函数:

现在,如果我将一个传递int给这个方法,它就会被装箱。因此,将上述方法定义如下不是更好吗?

以这种方式使用通用约束,我可以实现与上面的代码完全相同的功能,另外还有一个好处是不需要装箱(因为调用IsPositive<int>接受 type 的参数int)。

上面的示例代码显然毫无意义。但我更广泛的问题是:以后一种方式定义方法(使用通用约束而不是具有某种接口类型的参数)以避免潜在的值类型装箱不是总是有意义的吗?

我怀疑答案很可能是“是的,但它需要更多的输入,并且在许多情况下遇到值类型的可能性很小,例如当方法接受 some 时IEnumerable<T>”。但我想知道这些方法之间是否存在更大的差异,而这些方法目前正在逃避我。

0 投票
6 回答
3088 浏览

c# - C# 中的 var 关键字会导致装箱吗?

我的老板禁止我使用var,因为它会导致装箱并减慢应用程序的速度。

真的吗?

0 投票
1 回答
601 浏览

c# - 在不知道盒子里面有什么的情况下拆箱 uint/int

我有一个object o被称为盒装intuint

我不知道盒子里有什么,我只关心里面有 4 个字节我想强制转换为intor uintunchecked当我有值(而不是框)时,这在上下文中可以正常工作:

注意:默认情况下,C# 中的所有内容都是未检查的,未检查的上下文仅在此处是必需的,因为我们正在处理文字,编译器想知道我们是否真的想在脚下开枪。

现在的问题是我不知道盒子里面有什么(除了它是 4 个字节),但是当我尝试解开错误的类型时,运行时会这样做,我得到一个InvalidCastException. 我知道这是合理的运行时行为,但在这种情况下,我知道我在做什么并且想要一个“未选中的取消框”。存在这样的东西吗?

我知道我可以catch重试,所以这不算作答案。

0 投票
3 回答
1135 浏览

java - 将整数值分配给 Java 中的 Float 包装器

以下作品

但以下没有:

不应该将 3 自动提升为 float (因为扩大转换不需要显式转换)然后 Boxed 到 Float 类型?

是因为我在 Khalid Mogul 的 Java 书中读到的一条规则吗?

任何拳击转换都不能跟随扩大转换

0 投票
2 回答
1234 浏览

c# - ((IEnumerable)source).OfType 有什么区别() 和源为 IEnumerable

((IEnumerable)source).OfType<T>()和有什么区别source as IEnumerable<T>

对我来说,它们看起来很相似,但事实并非如此!

source是 type IEnumerable<T>,但它被装箱为object.

编辑

这是一些代码:

在另一个地方,我创建了一个 PagedList 的实例

如果有人能告诉我为什么我必须将 mappedList 转换为对象,我将非常感激:)

这里是 MapAndCreateSubList 方法和 Map 委托:

0 投票
2 回答
2303 浏览

c# - 当声明为函数的返回值时,C# 结构是否会被装箱?

一个简单的问题,但我还没有在 Stack Overflow 上找到明确的答案。

从函数返回时, C#结构(值类型)是否总是复制到堆栈中,无论它有多大?我不确定的原因是,对于 MSIL 以外的某些指令集(例如 x86),返回值通常需要适合处理器寄存器,并且不直接涉及堆栈。

如果是这样,是否是调用站点在CLR堆栈上为(预期的)值返回类型预分配空间?

[编辑:答复摘要:] 对于原始问题的意图,答案是否定的;CLR永远不会(默默地)将一个结构装箱,只是为了将其作为返回值发送。

0 投票
3 回答
7563 浏览

c# - Nullable 的装箱/拆箱行为如何可能的?

今天早些时候我发生了一件让我摸不着头脑的事情。

任何类型的变量Nullable<T>都可以分配给null. 例如:

起初,如果不以某种方式定义从objectto的隐式转换,我看不到这怎么可能Nullable<T>

但是上面的运算符显然不存在,就好像它确实存在那么以下也必须是合法的,至少在编译时(它不是):

然后我意识到,也许该Nullable<T>类型可以定义隐式转换为一些永远无法实例化的任意引用类型,如下所示:

但是,这并不能解释我接下来发生的事情:如果该HasValue属性false适用于任何Nullable<T>值,则该值将被装箱为null

此外,如果HasValueis true该值将被装箱为 aT而不是 a T?

但这似乎意味着存在从 to 的自定义隐Nullable<T>转换object

这显然不是object所有类型的基类,用户定义的与基类型之间的隐式转换是非法的(它们也应该如此)。

似乎object x = i;应该像任何其他值类型一样装箱i,这样x.GetType()会产生与typeof(int?)(而不是 throw a NullReferenceException)相同的结果。

所以我挖了一下,果然,事实证明这种行为是特定于Nullable<T>类型的,在 C# 和 VB.NET 规范中特别定义,并且在任何用户定义的struct(C#) 或Structure(VB.NET ) 中都不可重现)。

这就是为什么我仍然感到困惑。

这种特殊的装箱和拆箱行为似乎无法手动实现。它之所以有效,是因为 C# 和 VB.NET 都对Nullable<T>类型进行了特殊处理。

  1. Nullable<T>在没有给予这种特殊处理的情况下,理论上是否可能存在不同的基于 CLI 的语言?Nullable<T>并且该类型不会因此在不同的语言中表现出不同的行为吗?

  2. C# 和 VB.NET 如何实现这种行为?CLR 支持吗?(也就是说,CLR 是否允许一个类型以某种方式“覆盖”它的装箱方式,即使 C# 和 VB.NET 本身禁止它?)

  3. 甚至有可能(在 C# 或 VB.NET 中)将 a 装箱Nullable<T>object