有人可以解释为什么为MemoryMarshal.Cast
定义Span<T>
而不为Memory<T>
定义吗?它们本质上都是指向连续内存的指针。因此,我看不出为什么Span cast比Memory cast更安全。
我正在寻找的是任何使用通信协议的程序员的梦想:从任何数组到字节数组的非复制转换,类似
public static byte[] ToBytes<A>(this A[] a) where A : struct {
Memory<A> m = a;
Memory<byte> mb = MemoryMarshal.Cast<A, byte>(m); // Compiler error !
ArraySegment<byte> ba;
bool b = MemoryMarshal.TryGetArray(mb, out ba);
return ba.Array;
}
此外,做类似事情的其他方法似乎也受阻(例如,没有从Span到内存的转换,TryGetArray
对Span不起作用...)我想所有这些都有很好的理由这些禁忌;但是,我找不到一个。