Generics 具有泛型类型和静态成员的意外编译器警告

Generics 具有泛型类型和静态成员的意外编译器警告,generics,f#,Generics,F#,我想创建自己的列表类型CountedList;计数=0} 成员this.AddOne(element)={this with List=element::this.List;Count=this.Count+1} 其思想是从一个CountList开始。清空某个类型,然后通过AddOne方法添加一个元素 但是,当我尝试使用以下内容创建空列表时: let emptyDoubleList = CountedList.Empty<double>() let emptyDoubleL

我想创建自己的列表类型
CountedList;计数=0}
成员this.AddOne(element)={this with List=element::this.List;Count=this.Count+1}
其思想是从一个CountList开始。清空某个类型,然后通过AddOne方法添加一个元素

但是,当我尝试使用以下内容创建空列表时:

let emptyDoubleList = CountedList.Empty<double>()   
let emptyDoubleList=CountedList.Empty()
我得到以下警告:

The instantiation of the generic type 'CountedList' is missing and can't be inferred from the arguments or return type of this member. Consider providing a type instantiation when accessing this type, e.g. 'CountedList<_>'.
缺少泛型类型“CountedList”的实例化,并且无法从此成员的参数或返回类型推断。考虑在访问此类型时提供类型实例化,例如“COUNTEDLIST”。
但直接这样做:

let directEmptyDoubleList = {List=List.empty<double>; Count=0}
让directEmptyDoubleList={List=List.empty;Count=0}
不发出警告

为什么我会收到这个警告?编译器不应该意识到它是一个CountedList吗?此外,对于如何改进CountedList实施的任何建议,我们也将不胜感激

以下是完整的代码示例:

type CountedList<'T> = {List: 'T list; Count: int}
                            static member Empty<'a> () = {List=List.empty<'a>; Count=0}
                            member this.AddOne(element) = {this with List=element::this.List; Count=this.Count + 1}

let emptyDoubleList = CountedList.Empty<double>()   //Why does this give me a warning??

let directEmptyDoubleList = {List=List.empty<double>; Count=0}
类型CountedList;计数=0}
成员this.AddOne(element)={this with List=element::this.List;Count=this.Count+1}
let emptyDoubleList=CountedList.Empty()//为什么这会给我一个警告??
让directEmptyDoubleList={List=List.empty;Count=0}

这是因为
Empty
方法的类型参数不必与
CountedList
类的类型参数匹配。因此,
CountedList.Empty()
是一个有效的方法调用,它将返回一个
CountedList
,编译器无法确定这是否是您想要的


您可能希望将
Empty
设为非泛型方法,并使用
List.Empty这是因为
Empty
方法的类型参数不必与
CountedList
类的类型参数相匹配。因此,
CountedList.Empty()
是一个有效的方法调用,它将返回一个
CountedList
,编译器无法确定这是否是您想要的


您可能希望将
Empty
设为非泛型方法,并使用
List。Empty我很惊讶编译器没有意识到本例中
CountedList
的类型并不重要,只有
Empty
命令中的类型才重要。谢谢你的解释。我很惊讶编译器没有意识到本例中
CountedList
的类型并不重要,只有
Empty
命令中的类型才重要。谢谢你的解释。
type CountedList<'T> = {List: 'T list; Count: int}
                            static member Empty<'a> () = {List=List.empty<'a>; Count=0}
                            member this.AddOne(element) = {this with List=element::this.List; Count=this.Count + 1}

let emptyDoubleList = CountedList.Empty<double>()   //Why does this give me a warning??

let directEmptyDoubleList = {List=List.empty<double>; Count=0}