43

Span<T>可能であればヒープ割り当てを回避するためにライブラリをリファクタリングしていますが、古いフレームワークもターゲットにしているため、いくつかの一般的なフォールバック ソリューションも実装しています。しかし今、私は奇妙な問題を発見しました。.NET Core 3 でバグを発見したのか、それとも私が何か違法なことをしているのかよくわかりません。

問題:

// 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;
}

興味深いことに、ReinterpretOldこれは .NET Framework と .NET Core 2.0 でうまく動作します (したがって、私はこれで十分満足できます) が、それでも少し気になります。

ところで。ReinterpretOld小さな変更により、.NET Core 3.0 でも修正できます。

//return *(uint*)bytes;
uint* asUint = (uint*)bytes;
return *asUint;

私の質問:

これはバグですか、それともReinterpretOld古いフレームワークで偶然に機能するのでしょうか? それらにも修正を適用する必要がありますか?

備考:

  • デバッグ ビルドは .NET Core 3.0 でも機能します
  • に申し込んでみまし[MethodImpl(MethodImplOptions.NoInlining)]ReinterpretOldが、効果がありませんでした。
4

1 に答える 1