共用方式為


已改變封閉式泛型的 UnsafeAccessor 支援

.NET 8 引進了 UnsafeAccessorAttribute 屬性,該屬性允許存取型別的不可見成員 (也稱為「快速私下反映」)。 由於時間限制,未新增 .NET 8 中的泛型支援。 不過,在 CoreCLR 和原生 AOT 中,一些涉及封閉式泛型型別且非常狹窄的不支援案例「確實有作用」。 這些案例應該已遭到封鎖,但無意中並未遭封鎖。 .NET 9 中已新增新的限制。

如需詳細資訊和範例,請參閱 UnsafeAccessorAttribute 的備註

先前的行為

在 .NET 8 中,對型別實作了天真簽章查閱,而在某些情況下,使用泛型型別會被視為有效。 例如,下列程式碼成功:

[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void CtorAsMethod(List<int> c);

新的行為

從 .NET 9 開始,取用泛型型別的完整支援和記載的方式是確保 extern static 方法的型別參數符合私人方法的型別參數,而 extern static 方法的方法參數符合私人方法的方法參數。 這些限制是必要的,因為執行階段會執行嚴格的中繼資料簽章比對。

class Accessor<T>
{
    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
    public extern static void CtorAsMethod(List<T> c);
}

導入的版本

.NET 9 Preview 6

中斷性變更的類型

此變更為行為變更

變更原因

在官方 .NET 8 版本中,支援搭配 UnsafeAccessorAttribute 使用泛型型別是偶然的。 在開發初期,這是可能支援的案例,但後來延遲到 .NET 9,因為小組遇到複雜度問題。 官方文件並未提及泛型,也沒有提供任何使用泛型的範例。 這項變更會更正行為。

閱讀 UnsafeAccessorAttribute API 的已更新文件,並視需要變更您的程式碼,以符合泛型型別的新限制。

受影響的 API