相关疑难解决方法(0)

为什么我的C#数组在转换为对象时会丢失类型符号信息?

调查一个bug,我发现这是由于c#中的这种奇怪:

sbyte[] foo = new sbyte[10];
object bar = foo;
Console.WriteLine("{0} {1} {2} {3}",
        foo is sbyte[], foo is byte[], bar is sbyte[], bar is byte[]);
Run Code Online (Sandbox Code Playgroud)

输出为"True False True True",而我希望" bar is byte[]"返回False.显然酒吧既是一个byte[]又是一个sbyte[]?同样的情况对于其他符号/无符号类型,如Int32[]VS UInt32[],但不是说Int32[]VS Int64[].

谁能解释这种行为?这是在.NET 3.5中.

c# arrays types command-line-interface

42
推荐指数
3
解决办法
2361
查看次数

C#StructLayout/FieldOffset和数组索引

我在使用FieldOffset时遇到了一些问题.下面的代码是一个例子,它对我不起作用:

[StructLayout(LayoutKind.Explicit)]
public struct IndexStruct {
    [FieldOffset(0)]
    public byte[] data;

    [FieldOffset(0)]
    public short[] idx16;

    [FieldOffset(0)]
    public int[] idx32;
}
Run Code Online (Sandbox Code Playgroud)

例如,如果我将名为"data"的数组设置为序列化字节数组,然后尝试使用"idx16"字段将数据检索为short,则索引仍然作为byte []对齐.这意味着idx16 1获取数据中的第二个字节,而不是第二个16位字(字节2和3).如果我执行逆I索引短路而不是字节,则意味着偏移对齐从源数据继承.我的问题是,有办法解决这个问题吗?我知道我可以通过乘以元素的大小来补偿索引值,但还有另一种方法吗?

是我在StackOverflow上找到的答案,但在尝试该代码时,结果证明它无法正常工作.使用以下代码在VS中使用单元测试尝试使用它,但没有成功:

[TestMethod()]
public void SumTest() {
    float[] fArr = {2.0f, 0.5f, 0.0f, 1.0f};
    MemoryStream ms = new MemoryStream();
    for (int i = 0; i < fArr.Length; i++) {
        ms.Write(BitConverter.GetBytes(fArr[i]), 0, sizeof(float));
    }
    byte[] buff = ms.ToArray();
    double expected = 3.5f;
    double actual = Sum(buff);
    Assert.AreEqual(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)

提前谢谢了!

c# arrays indexing field alignment

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

arrays ×2

c# ×2

alignment ×1

command-line-interface ×1

field ×1

indexing ×1

types ×1