C# 数组和数组之间的差异,其中T是ValueType

C# 数组和数组之间的差异,其中T是ValueType,c#,arrays,c++-cli,C#,Arrays,C++ Cli,我正在为我的C项目在本机库上编写一个C++/CLI包装器。我试图将STD::在C. C++中转换为Stasy.Byth[]的向量 在C++/CLI中,这两种变体都有效 自动arr=gcnew array10; 自动arr=gcnew array10; 但在C代码的第一种情况下,我们得到了System::Byte[]类型,而在第二种情况下,我们得到了System::ValueType[] 所以我的问题是为什么我们会有如此奇怪的行为?hat应该只用于引用类型。字节是一种值类型,因此数组是正确的声明

我正在为我的C项目在本机库上编写一个C++/CLI包装器。我试图将STD::在C. C++中转换为Stasy.Byth[]的向量 在C++/CLI中,这两种变体都有效

自动arr=gcnew array10; 自动arr=gcnew array10; 但在C代码的第一种情况下,我们得到了System::Byte[]类型,而在第二种情况下,我们得到了System::ValueType[]

所以我的问题是为什么我们会有如此奇怪的行为?

hat应该只用于引用类型。字节是一种值类型,因此数组是正确的声明

不幸的是,C++/CLI还允许字节^数组,在.NET代码中,将值转换为对象是受支持的方案。数组现在包含对对象的引用,对象是字节的装箱值。装箱转换实现了一种著名的错觉,即值类型继承自System::Object派生的System::ValueType。在32模式下,对象引用需要4个字节,装箱字节对象需要12个字节,而不是一个元素需要1个字节的存储空间


好吧,别那么做。我从来没有遇到过这样的场景:这是必要的或有用的。在一些情况下,装箱是必要的,例如反射,但是直接转到Object^更有意义,因为这是记录此类方法的方式。

我不擅长,但我相信在第一个示例中,您将按照预期声明字节数组。第二个例子是将一个装箱字节数组声明为值类型,这样就可以有引用了。也许你是对的。我很困惑,因为当您在C中创建System.Byte时,使用new关键字,即新字节装箱并没有发生。我猜,当您在c++/cli中调用适合我上面描述的第二个数组的gcnew System::Byte时,也会有相同的行为。