.net 为什么我不能将值类型的数组赋给对象数组变量?

.net 为什么我不能将值类型的数组赋给对象数组变量?,.net,vb.net,roslyn,.net,Vb.net,Roslyn,分配到a是正常的,分配到b会导致编译错误,为什么 Dim a As Object() = { 1 } Dim b As Object() = ({ 1 }) 错误消息是: 无法将“Integer()”类型的BC30333值转换为“Object()”,因为“Integer”不是引用类型 第一个示例之所以有效,是因为它推断并创建了一个对象数组 但是,在第二个示例中,首先计算括号内的部分,并将其推断为整数数组,然后它尝试将其分配给b(这当然不起作用,因为不能像那样转换整个数组) 根据MSDN文章选

分配到
a
是正常的,分配到
b
会导致编译错误,为什么

Dim a As Object() = { 1 }
Dim b As Object() = ({ 1 })
错误消息是:

无法将“Integer()”类型的BC30333值转换为“Object()”,因为“Integer”不是引用类型


第一个示例之所以有效,是因为它推断并创建了一个
对象
数组

但是,在第二个示例中,首先计算括号内的部分,并将其推断为
整数
数组,然后它尝试将其分配给
b
(这当然不起作用,因为不能像那样转换整个数组)


根据MSDN文章
选项推断将使编译器根据您给变量的值决定类型:

编译器根据初始化表达式的类型推断变量的类型

我想我已经弄明白了:

因为所有事情都必须正确完成,所以必须首先计算括号,然后计算语句的其余部分。编译器直到对整个语句求值后才知道您以后是否还要对括号内的数组执行更多操作。因此,它假定您需要一个整数数组


在第一个示例中,没有括号,因此可以直接计算整个语句,这将产生一个对象数组。当编译器发现它需要执行隐式转换时,它会选择
Object()
,因为这是您所说的您想要的,而且这是它唯一可以计算的内容。

第一个示例之所以有效,是因为它推断并创建了
对象
数组

但是,在第二个示例中,首先计算括号内的部分,并将其推断为
整数
数组,然后它尝试将其分配给
b
(这当然不起作用,因为不能像那样转换整个数组)


根据MSDN文章
选项推断将使编译器根据您给变量的值决定类型:

编译器根据初始化表达式的类型推断变量的类型

我想我已经弄明白了:

因为所有事情都必须正确完成,所以必须首先计算括号,然后计算语句的其余部分。编译器直到对整个语句求值后才知道您以后是否还要对括号内的数组执行更多操作。因此,它假定您需要一个整数数组


在第一个示例中,没有括号,因此可以直接计算整个语句,这将产生一个对象数组。当编译器发现它需要执行隐式转换时,它选择
Object()
,因为这就是你所说的你想要的,因为这是它唯一可以计算的东西。

要确切地回答标题中的问题,因为一个值类型数组实际上只包含一个连续的内存块,存储每个值类型,但是一个对象数组由一个连续的内存块组成,内存块保存着对象引用

当然,您可以通过装箱将值类型转换为对象引用。但不能保证对象引用和值类型占用相同的内存量,即使有,单个连续内存块也不能同时保存值类型和对象引用


如果确实需要执行这种“分配”,则必须以某种方式分配新数组(例如,可能通过LINQs
Cast
ToArray
方法),并且一旦创建,这两个数组是完全独立的-对其中一个数组中的值的更改不会通过对另一个数组中已装箱的值的更改来反映。

为了确切地回答标题中的问题-因为值类型数组实际上只包含一个连续的内存块,存储每种值类型,但是一个对象数组由一个连续的内存块组成,内存块保存着对象引用

当然,您可以通过装箱将值类型转换为对象引用。但不能保证对象引用和值类型占用相同的内存量,即使有,单个连续内存块也不能同时保存值类型和对象引用


如果确实需要执行这种“分配”,则必须以某种方式分配新数组(例如,可能通过LINQs
Cast
ToArray
方法),并且一旦创建,这两个数组是完全独立的-对其中一个数组中的值的更改不会通过对另一个数组中已装箱的值的更改来反映。

这是因为
Integer不是引用类型。
。如果您尝试使用
String
,则没有问题。它会将类型推断为
整数
@MichalHosala,我的错误,对此表示抱歉。如果您将整数放入其中,为什么要将数组声明为
Object()
?选民是否介意陈述他/她不喜欢这个问题的地方?它的格式很好,并且清楚地描述了我的要求。这是因为
Integer不是一个引用类型
。如果您尝试使用
String
,则没有问题。它会将类型推断为
整数
@MichalHosala,我的错误,对此表示抱歉。如果您将整数放入其中,为什么要将数组声明为
Object()
?选民是否介意陈述他/她不喜欢这个问题的地方?它的格式很好,并且清楚地描述了我所要求的内容。所以你基本上是说隐式类型的数组,它没有用括号括起来,它本身就没有类型,它总是依赖于上下文?如果这是真的,那么我认为这意味着我开始的这个方法在某种程度上是无效的,你同意吗?@MichalHosala:我对Roslyn不太在行,但一般来说编译器倾向于计算括号