无论如何有明确的强制转换/强制
sbyte[]
或byte[]
到bool[]
char[]
到short[]
/ushort[]
在CIL中,您经常会看到诸如
stelem Type sbyte (ldloc pArray) ldc_i4 1 ldc_i4 0
这是在pArray[1] = true
哪里pArray
type的一维数组bool[]
。我想通过在c#中复制它
(sbyte[])pArray[1] = 1;
不幸的是,C#编译器不允许这样做。
未记录的技巧,请自担风险:
(例如,此处和其他许多地方所示)
[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] 删除。
我来说两句