微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在旧 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 现在是主要(我不知道,但可能是这种情况),那么这可能会导致整个事情没用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。