F# 实现泛型接口:构造导致代码不像类型注释所指示的那样泛型

F# 实现泛型接口:构造导致代码不像类型注释所指示的那样泛型,f#,F#,我需要实现如下接口: 接口IEvent:IEvent{ T数据{get;} } 公共接口事件 { Guid Id{get;set;} 长版本{get;set;} 长序列{get;set;} 对象数据{get;} Guid StreamId{get;set;} 字符串StreamKey{get;set;} DateTimeOffset时间戳{get;set;} 字符串TenantId{get;set;} 类型EventType{get;} 字符串EventTypeName{get;set;} 字

我需要实现如下接口:

接口IEvent:IEvent{
T数据{get;}
}
公共接口事件
{
Guid Id{get;set;}
长版本{get;set;}
长序列{get;set;}
对象数据{get;}
Guid StreamId{get;set;}
字符串StreamKey{get;set;}
DateTimeOffset时间戳{get;set;}
字符串TenantId{get;set;}
类型EventType{get;}
字符串EventTypeName{get;set;}
字符串DotNetTypeName{get;set;}
}
这就是我想到的:

type WrappedEvent WrappedEvent registeredCustomer:>Events.IEvent
|CustomerDeleted Deleted客户->WrappedEvent Deleted客户:>Events.IEvent
编译器为

此类型参数的使用方式限制其始终为“obj”
由于无法泛化显式类型变量“T”,因此此代码的泛型性低于其注释所需的泛型。
它被限制为“obj”。
成员val数据
处显示一条关于
数据
的警告:

此构造导致代码不像类型注释所指示的那样通用。
类型变量“T”已被约束为类型“obj”。
我如何解决这个问题

更新:


如果我像这样实现接口Events.IEvent首先,那么您在这里实现的是两个接口,而不是一个,
IEvent
及其基本接口
IEvent
。因此,您需要添加两个
接口。。。带有
块-每个块一个:

type WrappedEvent<'T>(x: 'T) =
    interface Events.IEvent<'T> with
      member val Data = x with get

    interface Events.IEvent with
      member val Data = x with get
      member val DotNetTypeName = null with get, set
      member val EventType = null
      ...
但是等等!这仍然行不通。问题是,
member val
不仅声明了一个属性,还声明了它的支持字段。现在您声明了两个不同的支持字段,都名为
Data
,但类型不同。(另外,顺便说一句,您实际上不需要单独的支持字段,对吗?因为您已经有了
x

因此,要解决这一问题,请将其设置为不带支持字段的属性:

    interface Events.IEvent<'T> with
        member self.Data with get() = x

    interface Events.IEvent with
        member self.Data with get() = x :> obj
        ...

interface Events.ievent是否忘记指定接口的通用参数?是否有另一个名为
IEvent
,但不是泛型的接口?这是早期流行的模式。NET@FyodorSoikin你的意思是像
接口事件。IEvent@FyodorSoikin我在问题中添加了更多信息,所以您根本没有实现
IEvent
,对吗?这不是我的目标吗?我把它改成了
interface Events.IEventThanks,现在一切正常了。
    interface Events.IEvent<'T> with
        member self.Data with get() = x

    interface Events.IEvent with
        member self.Data with get() = x :> obj
        ...