Types 实现文件中未正确理解签名文件中的列表声明
我有以下签名文件Types 实现文件中未正确理解签名文件中的列表声明,types,f#,Types,F#,我有以下签名文件F.fsi: module M = type T1 = A | B type T2 = | F | G static member x1 : list<T1> static member x2 : list<T1> Visual Studio将x2的定义用红线标出,并显示以下错误消息: 模块“M”包含静态成员M.T2.x2:obj列表但其签名 指定静态成员M.T2.x2:
F.fsi
:
module M =
type T1 = A | B
type T2 =
| F
| G
static member x1 : list<T1>
static member x2 : list<T1>
Visual Studio将x2
的定义用红线标出,并显示以下错误消息:
模块“M”包含静态成员M.T2.x2:obj列表
但其签名
指定静态成员M.T2.x2:T1列表
类型不同
似乎在实现文件中,空列表被推断为具有泛型类型,即使签名文件清楚地指示列表的类型为T1
。我尝试了以下更正:
static member (x2 : list<T1>) : []
静态成员(x2:list):[]
但这次我收到了以下错误消息:
在let rec
构造中只能绑定简单的变量模式
我将
x1
和x2
改为函数,从而避开了这个问题,但是有没有其他方法可以让Visual Studio正确推断列表的类型?注释应该是
module M =
type T1 = A | B
type T2 =
| F
| G
static member x1 = [T1.A; T1.B]
static member x2 : List<T1> = []
模块M=
T1型=A | B型
T2型=
|F
|G
静态成员x1=[T1.A;T1.B]
静态成员x2:List=[]
因为您正在注释返回类型,所以注释应该是
module M =
type T1 = A | B
type T2 =
| F
| G
static member x1 = [T1.A; T1.B]
static member x2 : List<T1> = []
模块M=
T1型=A | B型
T2型=
|F
|G
静态成员x1=[T1.A;T1.B]
静态成员x2:List=[]
因为您正在注释返回类型,所以您刚刚遇到了一个棘手的问题:值在.net中不能是泛型的-因此类型推断(它不会首先检查签名文件,而是在上下左右工作)会看到
[]:'一个列表
,并将其强制为对象列表
,因为。。。John已经告诉过你如何解决这个问题了,这里只是一个简短的评论:没有括号的静态成员x2:list
也可以!但是括号导致了文章中指出的错误。您刚刚遇到了一个棘手的问题:值在.net中不能是泛型的-因此类型推断(它不会首先检查签名文件,但会在上下左右工作)会看到[]:'一个列表
,并将其强制为obj列表
。。。John已经告诉过你如何解决这个问题了,这里只是一个简短的评论:没有括号的静态成员x2:list
也可以!但是括号会导致文章中指出的错误。太好了。非常感谢,太好了。非常感谢你。