无法将'byte'类型转换为'T'

时间:2011-06-13 18:30:47

标签: c# generics casting

我是C#的新手,所以我真的不知道如何制作它,但在C ++中我是这样做的

template <typename T> writeInt(int location, T value){
    *(T*)&buffer[location] = value;
}

在C#中我试图做同样的事情

public void WriteInt<T>(int location,T value)
        {
            (T)buffer[location] = value;
        }

但是我发现了这个错误Cannot convert type 'byte' to 'T' 我怎么能这样做,谢谢

3 个答案:

答案 0 :(得分:5)

首先,

您应该使用MemoryStreamBinaryWriter将原始类型写入缓冲区。您可以按照建议使用BitConverter类,但最终会有很多中间byte[]对象。

byte[] buffer;

int value1 = 10;
double value2 = 20;
string value3 = "foo";

using(var ms = new System.IO.MemoryStream())
{
    using(var writer = new System.IO.BinaryWriter(ms))
    {
        writer.Write(value1);
        writer.Write(value2);
        writer.Write(value3);
    }
}

buffer = ms.ToArray();

value1value2value3只是示例,向您展示了几种可用的重载;您应该查看the MSDN page on BinaryWriter以获取更多信息)

更重要的是,

您在C ++代码中使用指针运算; C#仅在unsafe块中运行时提供真正的指针功能,如果可能的话(在此处),应该避免使用它。 .NET适用于引用,而不是指针,因此您无法控制实际的内存分配。

长话短说,你不能按照你想要的方式做你想做的事。

答案 1 :(得分:2)

为了做你想做的事,我相信你需要做这样的事情:

byte[] buffer = new byte[8192] ;
void WriteInt<T>( int offset , T value)
{
  Type       tBitConvert = typeof(BitConverter) ;
  MethodInfo getBytes    = tBitConvert.GetMethod( "GetBytes" ,
                             BindingFlags.Static|BindingFlags.Public ,
                             Type.DefaultBinder , new Type[]{ typeof(T) } ,
                             null 
                             ) ;

  if ( getBytes == null ) throw new InvalidOperationException("invalid type") ;

  byte[] octets = (byte[]) getBytes.Invoke(null, new object[]{ value } ) ;

  Array.Copy( octets , 0 , buffer , offset , octets.Length ) ;
  return ;
}

但我认为你会变得更好 - 当然更加惯用 - 如果你只是使用System.IO.BinaryStream,将其分类以提供你想要的缓冲。

答案 2 :(得分:0)

  

所以我可以说WriteInt或32   etc,buffer = byte []

在任何一种情况下都不允许你拥有。

如果缓冲区字节数组,则需要将转换为字节数组。