在C#中将字节,UInt16和UInt32数据类型分配给Object数据类型

时间:2013-12-24 22:21:26

标签: c#

根据this MSDN链接,Object数据类型可以指向任何数据类型。但是,这样做时我收到错误。我的代码如下。

public bool Write(Object[] data, UInt32 numData)
{
   // Code
}

测试Write API的代码如下:

byte[] writeBuffer = new byte[256];
Random rnd = new Random();
UInt32 size = 256;
rnd.NextBytes(writeBuffer);
data.Write(writeBuffer, size);

这里,writeBuffer是一个字节数组,但它也可以是UInt16或UInt32数组。我在 data.Write 行中收到错误,其中无效参数

请告诉我这是什么问题。

编辑1: 我的应用程序提供了#34;写"可以采用字节,UInt16或UInt32类型数组的API。根据数据类型(在创建对象时设置),API在内部将UInt16和UInt32转换为字节数组并将其传递给底层。顺便说一句,这是.Net Microframework,其中API下面的层是本机c ++代码。

感谢。

3 个答案:

答案 0 :(得分:1)

您需要将byte []强制转换为对象数组,例如:

writeBuffer.Select(c=>(object)c).ToArray()

请注意,这称为“拳击”并且会产生性能成本,如果可能,请继续使用byte []。

答案 1 :(得分:1)

通过使用Write的泛型定义来避免装箱惩罚:

public bool Write<T>(T[] data, UInt32 size) {
  // Code
}

并像这样调用它:

data.Write(writeBuffer, size);

在大多数情况下,如上所述,C#编译器将能够自动确定要推断 T 的正确类型,尽管您可以在调用期间始终在必要时指定它:

UInt32[] uint32Array;
// :
data.Write<UInt32>(uint32Array, (UInt32)uint32Array.Count());

答案 2 :(得分:1)

没有什么“指向”任何东西,没有涉及指针,大多数(并非所有)类型都从对象继承,但这并不意味着从对象数组继承的某个数组,它只是意味着数组中的元素对象可以是任何东西。

.Write需要一个对象数组,并且你传入一个字节数组,它将无法工作。你必须逐个设置元素(因为单个字节是一个对象,所以它可以存储在一个对象[])

然而,当我回答问题时,问题本身可能隐藏了一些糟糕的设计,你为什么要这样做呢?你能告诉我们你的功能用例,以便我们建议替代方案吗?大多数情况下,如果您直接使用对象或对象集合,那么您做错了。