I'm refactoring my libraries to use Span<T> for avoiding heap allocations if possible but as I target also older frameworks I'm implementing some general fallback solutions as well. But now I found a weird issue and I'm not quite sure whether I found a bug in .NET Core 3 or am I doing something illegal.
The issue:
// This returns 1 as expected but cannot be used in older frameworks:
private static uint ReinterpretNew()
{
    Span<byte> bytes = stackalloc byte[4];
    bytes[0] = 1; // FillBytes(bytes);
    // returning bytes as uint:
    return Unsafe.As<byte, uint>(ref bytes.GetPinnableReference());
}
// This returns garbage in .NET Core 3.0 with release build:
private static unsafe uint ReinterpretOld()
{
    byte* bytes = stackalloc byte[4];
    bytes[0] = 1; // FillBytes(bytes);
    // returning bytes as uint:
    return *(uint*)bytes;
}
Interestingly enough, ReinterpretOld works well in .NET Framework and in .NET Core 2.0 (so I could be happy with it after all), still, it bothers me a bit.
Btw. ReinterpretOld can be fixed also in .NET Core 3.0 by a small modification:
//return *(uint*)bytes;
uint* asUint = (uint*)bytes;
return *asUint;
My Question:
Is this a bug or does ReinterpretOld work in older frameworks only by accident and should I apply the fix also for them?
Remarks:
- The debug build works also in .NET Core 3.0
- I tried to apply [MethodImpl(MethodImplOptions.NoInlining)]toReinterpretOldbut it had no effect.
 
    