Generics 创建二级非泛型构造函数时F#中出现编译器错误

Generics 创建二级非泛型构造函数时F#中出现编译器错误,generics,interface,f#,Generics,Interface,F#,我有一个泛型类,默认构造函数接受泛型类型的参数。当创建第二个非泛型构造函数时,F#编译器抱怨说这个类型参数的使用方式限制了它总是“EmptyType”,我完全不理解这个错误。为什么它会限制?第二个构造函数与第一个构造函数的泛型属性有什么关系 此示例显示了错误(可在F#游乐场中重现)。请注意,只需注释第二个构造函数(第9行),即可解决编译问题: 类型MyInterface=接口结束 类型EmptyType()=接口MyInterface 类型RealType(v:int)= 成员this.Valu

我有一个泛型类,默认构造函数接受泛型类型的参数。当创建第二个非泛型构造函数时,F#编译器抱怨说
这个类型参数的使用方式限制了它总是“EmptyType”
,我完全不理解这个错误。为什么它会限制?第二个构造函数与第一个构造函数的泛型属性有什么关系

此示例显示了错误(可在F#游乐场中重现)。请注意,只需注释第二个构造函数(第9行),即可解决编译问题:

类型MyInterface=接口结束
类型EmptyType()=接口MyInterface
类型RealType(v:int)=
成员this.Value=v
接口MyInterface
类型MyType MyInterface>(元素:'T)=
new()=MyType(EmptyType())
该成员。X=0
[]
让主=
//设a=MyType()//空构造函数,'T为EmptyType
设b=MyType(RealType(0))//不起作用,因为编译器说“T”总是空类型?什么?
0

不确定重载构造函数的具体限制是什么,导致
T
在这种情况下受到约束,但是以下代码使用
静态成员
可以按需要工作:

type MyInterface = interface end
type EmptyType() = interface MyInterface

type RealType(v: int) =
    member this.Value = v
    interface MyInterface

type MyType<'T when 'T :> MyInterface>(element: 'T) =
    static member Empty() = MyType(EmptyType()) 
    member this.X = 0

[<EntryPoint>]
let main _ =
    let a = MyType<_>.Empty() 
    let b = MyType(RealType(0)) 
    0
类型MyInterface=接口结束
类型EmptyType()=接口MyInterface
类型RealType(v:int)=
成员this.Value=v
接口MyInterface
类型MyType MyInterface>(元素:'T)=
静态成员Empty()=MyType(EmptyType())
该成员。X=0
[]
让主=
设a=MyType.Empty()
设b=MyType(RealType(0))
0

构造函数不能是泛型的。您的类型是泛型的,但每个构造函数必须返回定义它的确切类型。您不能让一个构造函数返回
MyType
,它必须返回
MyType
type MyType<'t>(t: 't) =
    static member CreateEmpty () = MyType(EmptyType())
let x = MyType<RealType>.CreateEmpty()
let x = MyType<_>.CreateEmpty()
module MyType =
    let createEmpty() = MyType(EmptyType)

let x = MyType.createEmpty()