在旧的 C# 版本中使用 ref struct 参数覆盖方法

Overriding a method with a ref struct param in older C# versions

我正在尝试重写 System.Text.Json 包中的 JsonConverter<T>,它有一个抽象的 Read 方法,可以被定义为:

public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

(Link 到自定义序列化 here。)

此处 ref Utf8JsonReader 将 reader 标记为引用结构。 “ref struct”是 7.2 中引入的功能。 (如果您不熟悉,这是一个仅用于堆栈的结构。MSDN Link

在我的组织中,我们的一个项目运行在旧编译器上,该编译器只能以 C# 6 为目标。有没有一种方法可以在 C# 6 中编写 MSIL 或代码来覆盖方法签名并实现派生 class 上面的签名?

否则你会看到如下错误: 结构 'System.Text.Json.Utf8JsonReader' 已过时:此版本不支持具有嵌入式引用的类型

不,您无法使用旧版本的 C# 正确实现基于 API 的引用结构 - [Obsolete] 非常有意 用于阻止您从这样做(尽管在其他一些类似的情况下,“mod-req”已被用于类似的效果)。 ref struct非常具体的 要求,如果不满足可能会导致严重的运行时问题(例如,早期的编译器可能会尝试 box这样的结构,会非常非常糟糕)。

简而言之:更新您的 C# 版本,或使用缺少您无法实现的 API 的旧版本库。作为第三种选择,您可以在仅存在 的较新版本的 C# 中创建您自己的库,以创建覆盖此 API 的抽象实现(也许仅 throw new NotSupportedException();),然后从下层 C# 应用程序继承 that。但是,如果 Utf8JsonReader API 现在是 primary (我不知道,但是 可能 是case),那么这可能会导致整个事情变得毫无用处。