将sbyte []转换为bool [],将char []转换为short []

缺口

无论如何有明确的强制转换/强制

  • sbyte[]byte[]bool[]
  • char[]short[]/ushort[]

在CIL中,您经常会看到诸如

stelem Type sbyte (ldloc pArray) ldc_i4 1 ldc_i4 0 

这是在pArray[1] = true哪里pArraytype的一维数组bool[]我想通过在c#中复制它

(sbyte[])pArray[1] = 1;

不幸的是,C#编译器不允许这样做。

Xanatos

未记录的技巧,请自担风险:

(例如,此处和其他许多地方所示)

[StructLayout(LayoutKind.Explicit)]
public struct ConvSByteBool
{
    [FieldOffset(0)]
    public sbyte[] In;
    [FieldOffset(0)]
    public bool[] Out;
}

然后:

var bytes = new sbyte[] { -2, -1, 0, 1, 2 };
var conv = new ConvSByteBool { In = bytes }.Out;
bool b1 = conv[0]; // true
bool b2 = conv[1]; // true
bool b3 = conv[2]; // false
bool b4 = conv[3]; // true
bool b5 = conv[4]; // true

请注意,此技巧通常与泛型不兼容。没有Conv<T, U>

当源和目标中元素的大小相同(sizeof(sbyte) == sizeof(bool)时,此技巧最有效否则会有一些限制(在上面的链接问题中描述)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章