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