F# 如何使用F实现这个通用C#接口?

F# 如何使用F实现这个通用C#接口?,f#,c#-to-f#,F#,C# To F#,我要创建一个在F#中具有以下内容的对象: 名称空间JWT { /// ///提供JSON序列化和反序列化。允许使用自定义序列化程序。 /// 公共接口序列化程序 { /// ///将对象序列化为JSON字符串 /// ///反对 ///JSON字符串 字符串序列化(对象obj); /// ///将JSON字符串反序列化为类型化对象。 /// ///对象类型 ///JSON字符串 ///强类型对象 T反序列化(字符串json); } } 我尝试过使用对象表达式,但泛型的反序列化方法让

我要创建一个在F#中具有以下内容的对象:

名称空间JWT
{
/// 
///提供JSON序列化和反序列化。允许使用自定义序列化程序。
/// 
公共接口序列化程序
{
/// 
///将对象序列化为JSON字符串
/// 
///反对
///JSON字符串
字符串序列化(对象obj);
/// 
///将JSON字符串反序列化为类型化对象。
/// 
///对象类型
///JSON字符串
///强类型对象
T反序列化(字符串json);
}
}
我尝试过使用对象表达式,但泛型的
反序列化
方法让我大吃一惊:

let序列化程序=
{
新的JWT.ijson序列化程序
具有
此成员。序列化(o:obj)=
带有“未实现”的故障
反序列化(json:string)=
让我们解码:结果
o
|结果。错误->
失误
}
错误是:

这段代码不够通用。无法泛化类型变量“a”,因为它将超出其作用域

我如何实现这一点?


$dotnet--版本
3.1.300

我们可以通过注释成员来处理此错误。这样,类型系统将有足够的信息来完全识别正在发生的事情

如果我稍微调整一下您的代码,我就能够编译它:

openthoth.Json
类型序列化程序=
抽象成员序列化:o:obj->string
抽象成员反序列化(json:string):'a=
将Decode.fromString payloadDecoder json与
|好的(o:a)->o
|错误->失败与错误
通过完全注释
反序列化
成员,现在应该满足类型系统

有几件事需要注意:

  • 我包括了一个F#版本的
    IJsonSerializer
    接口,这样我的代码就可以编译了。虽然这对你的最终结果不是必需的
  • 我为
    payloadDecoder
    添加了一个存根,因为您的问题中没有包含它。因此,即使这段代码将被编译,它实际上也不会工作

Decode.fromString的签名是什么?
Decode.fromString
来自
string->Decoder
奇怪,这在我的环境中不会发生,我使用的是F#Core 4.7.2,你的是什么?