// https://docs.microsoft.com/en-us/dotnet/api/system.array?view=netcore-3.1
// max array length is 0X7FEFFFFF = int.MaxValue - 1024^2 bytes
// max multi dim array length seems to be 0X7FEFFFFF x 2, but no confirmation found
private unsafe T ReadCompactMultiDim<T>()
{
// vllt. einfach eine weitere Read<T> Methode (z.B. ReadMultiDim),
// die keine generic constraint hat (leider), aber T zuerst auf IsArray
// geprüft wird
// beide Methoden definieren dann ein Lambda, um den Buffer entsprechender
// Größe zu erzeugen. Dieser Buffer wird dann gefüllt und kann von der
// jeweiligen Methode mit dem korrekten Typ zurückgegeben werden
//
// oder `T[,] = Read2D<T>()`, `T[,,] = Read3D<T>()`, etc ..., dann wäre generic constraint wieder möglich
// oder: use implicit cast operator for multi dim arrays? http://dontcodetired.com/blog/post/Writing-Implicit-and-Explicit-C-Conversion-Operators
//var a = ReadCompactMultiDim<T[,,]>();
var type = typeof(T);
var lengths = new int[] { 100, 200, 10 };
var size = lengths.Aggregate(1L, (x, y) => x * y);
object[] args = lengths.Cast<object>().ToArray();
var buffer = (T)Activator.CreateInstance(type, args);
var handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try
{
var span = new Span<byte>(handle.AddrOfPinnedObject().ToPointer(), (int)size);
span.Fill(0x25);
return buffer;
}
finally
{
handle.Free();
}
}