问题标签 [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.
c# - 投射到界面是拳击转换吗?
我有一个接口 IEntity
我有一个 Employee 类,它实现了这个接口
现在,如果我有以下代码
如果不是拳击转换,那么演员阵容如何工作?
java - 为什么在 Java 中比较 Integer 和 int 会抛出 NullPointerException?
观察这种情况让我很困惑:
因此,正如我认为首先执行装箱操作(即 java 尝试从中提取 int 值null
)并且比较操作具有较低的优先级,这就是引发异常的原因。
问题是:为什么在Java中以这种方式实现?为什么拳击比比较参考具有更高的优先级?或者为什么他们没有null
在拳击前实施验证?
目前,当NullPointerException
使用包装的原语抛出而不是使用真正的对象类型抛出时,它看起来不一致。
c# - 装箱和拆箱,为什么输出都不是“System.Object”?
我得到以下代码:
输出是:
为什么不是他们俩System.Object
?
.net - 通用约束是否应该优于使用接口作为参数类型?
考虑这个微不足道的函数:
现在,如果我将一个传递int
给这个方法,它就会被装箱。因此,将上述方法定义如下不是更好吗?
以这种方式使用通用约束,我可以实现与上面的代码完全相同的功能,另外还有一个好处是不需要装箱(因为调用IsPositive<int>
接受 type 的参数int
)。
上面的示例代码显然毫无意义。但我更广泛的问题是:以后一种方式定义方法(使用通用约束而不是具有某种接口类型的参数)以避免潜在的值类型装箱不是总是有意义的吗?
我怀疑答案很可能是“是的,但它需要更多的输入,并且在许多情况下遇到值类型的可能性很小,例如当方法接受 some 时IEnumerable<T>
”。但我想知道这些方法之间是否存在更大的差异,而这些方法目前正在逃避我。
c# - C# 中的 var 关键字会导致装箱吗?
我的老板禁止我使用var
,因为它会导致装箱并减慢应用程序的速度。
真的吗?
c# - 在不知道盒子里面有什么的情况下拆箱 uint/int
我有一个object o
被称为盒装int
或uint
:
我不知道盒子里有什么,我只关心里面有 4 个字节我想强制转换为int
or uint
。unchecked
当我有值(而不是框)时,这在上下文中可以正常工作:
注意:默认情况下,C# 中的所有内容都是未检查的,未检查的上下文仅在此处是必需的,因为我们正在处理文字,编译器想知道我们是否真的想在脚下开枪。
现在的问题是我不知道盒子里面有什么(除了它是 4 个字节),但是当我尝试解开错误的类型时,运行时会这样做,我得到一个InvalidCastException
. 我知道这是合理的运行时行为,但在这种情况下,我知道我在做什么并且想要一个“未选中的取消框”。存在这样的东西吗?
我知道我可以catch
重试,所以这不算作答案。
java - 将整数值分配给 Java 中的 Float 包装器
以下作品
但以下没有:
不应该将 3 自动提升为 float (因为扩大转换不需要显式转换)然后 Boxed 到 Float 类型?
是因为我在 Khalid Mogul 的 Java 书中读到的一条规则吗?
任何拳击转换都不能跟随扩大转换
c# - ((IEnumerable)source).OfType 有什么区别() 和源为 IEnumerable
((IEnumerable)source).OfType<T>()
和有什么区别source as IEnumerable<T>
对我来说,它们看起来很相似,但事实并非如此!
source
是 type IEnumerable<T>
,但它被装箱为object
.
编辑
这是一些代码:
在另一个地方,我创建了一个 PagedList 的实例
如果有人能告诉我为什么我必须将 mappedList 转换为对象,我将非常感激:)
这里是 MapAndCreateSubList 方法和 Map 委托:
c# - 当声明为函数的返回值时,C# 结构是否会被装箱?
一个简单的问题,但我还没有在 Stack Overflow 上找到明确的答案。
从函数返回时, C#结构(值类型)是否总是复制到堆栈中,无论它有多大?我不确定的原因是,对于 MSIL 以外的某些指令集(例如 x86),返回值通常需要适合处理器寄存器,并且不直接涉及堆栈。
如果是这样,是否是调用站点在CLR堆栈上为(预期的)值返回类型预分配空间?
[编辑:答复摘要:] 对于原始问题的意图,答案是否定的;CLR永远不会(默默地)将一个结构装箱,只是为了将其作为返回值发送。
c# - Nullable 的装箱/拆箱行为如何可能的?
今天早些时候我发生了一件让我摸不着头脑的事情。
任何类型的变量Nullable<T>
都可以分配给null
. 例如:
起初,如果不以某种方式定义从object
to的隐式转换,我看不到这怎么可能Nullable<T>
:
但是上面的运算符显然不存在,就好像它确实存在那么以下也必须是合法的,至少在编译时(它不是):
然后我意识到,也许该Nullable<T>
类型可以定义隐式转换为一些永远无法实例化的任意引用类型,如下所示:
但是,这并不能解释我接下来发生的事情:如果该HasValue
属性false
适用于任何Nullable<T>
值,则该值将被装箱为null
:
此外,如果HasValue
is 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>
类型进行了特殊处理。
Nullable<T>
在没有给予这种特殊处理的情况下,理论上是否可能存在不同的基于 CLI 的语言?Nullable<T>
并且该类型不会因此在不同的语言中表现出不同的行为吗?C# 和 VB.NET 如何实现这种行为?CLR 支持吗?(也就是说,CLR 是否允许一个类型以某种方式“覆盖”它的装箱方式,即使 C# 和 VB.NET 本身禁止它?)
甚至有可能(在 C# 或 VB.NET 中)将 a 装箱
Nullable<T>
吗object
?