首页 > 解决方案 > 在旧 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#c#-6.0c#-7.2

解决方案


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

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


推荐阅读