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

问题描述

我正在尝试覆盖 JsonConverter<T> 包中的 System.Text.Json,该包具有抽象的 Read 方法,可以将其重写为:

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

链接自定义序列化 here。)

此处 ref Utf8JsonReader 将 reader 标记为 ref 结构。 “ref struct”是 7.2 中引入的一个特性。 (如果您不熟悉,它是一个只能在堆栈上使用的结构体。MSDN Link

在我的组织中,我们的一个项目运行在只能针对 C# 6 的旧编译器上。有没有办法在 C# 6 中编写 MSIL 或代码,以覆盖方法签名并实现上述的派生类签名?

否则您将看到以下错误Struct 'System.Text.Json.Utf8JsonReader' 已过时:此版本不支持带有嵌入引用的类型

解决方法

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

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