c# - 在旧 C# 版本中使用 ref struct 参数覆盖方法
问题描述
我正在尝试覆盖具有抽象 Read 方法JsonConverter<T>
的System.Text.Json
包中的 a ,该方法可以被 ovveridden 为:
公共覆盖对象读取(参考 Utf8JsonReader 阅读器,类型 typeToConvert,JsonSerializerOptions 选项)
(此处链接到自定义序列化。)
这里ref Utf8JsonReader
将 reader 标记为 ref 结构。“ref struct”是 7.2 中引入的一个特性。(如果您不熟悉,这是一个只能在堆栈上使用的结构。MSDN Link)
在我的组织中,我们的一个项目在只能针对 C# 6 的旧编译器上运行。有没有办法在 C# 6 中编写 MSIL 或代码,可以覆盖方法签名并实现上述签名的派生类?
否则你会看到以下错误: Struct 'System.Text.Json.Utf8JsonReader' is obsolete: Types with embedded references is not supported in this version
解决方案
不,您无法使用旧版本的 C# 正确实现基于 ref-struct 的 API -非常有意[Obsolete]
地使用它来阻止您这样做(尽管在其他一些类似情况下,“mod-req”已用于类似效果) . 有非常具体的要求,如果不满足可能会导致严重的运行时问题(例如,早期的编译器可能会尝试装箱这样的结构,这将非常非常糟糕)。ref struct
简而言之:更新您的 C# 版本,或使用缺少您无法实现的 API 的旧版本库。作为第三种选择,您可以在更新版本的 C# 中创建您自己的库,该库仅用于创建覆盖此 API 的抽象实现(可能只使用throw new NotSupportedException();
),然后从您的下级 C# 应用程序继承它。但是,如果Utf8JsonReader
API 现在是主要的(我不知道,但可能是这种情况),那么这可能会导致整个事情变得无用。