实现文件中未正确理解签名文件中的列表声明

时间:2016-01-30 11:15:24

标签: types f#

我有以下签名文件F.fsi

module M =

    type T1 = A | B

    type T2 =
        | F
        | G
        static member x1 : list<T1>
        static member x2 : list<T1>

在我的实施文件F.fs中,我有以下内容:

module M =

    type T1 = A | B

    type T2 =
        | F
        | G
        static member x1 = [T1.A; T1.B]
        static member x2 = [] // LINE MARKER 1; ERROR OCCURS HERE

Visual Studio使用以下错误消息对x2的定义进行红线处理:

  

模块'M'包含static member M.T2.x2 : obj list但它的签名   指定static member M.T2.x2 : T1 list类型不同

似乎在实现文件中,空列表被推断为具有泛型类型,即使签名文件清楚地指示列表是T1类型。我尝试了以下更正:

    static member (x2 : list<T1>) : []

但这次我收到以下错误消息:

  

只能在let rec构造

中绑定简单的变量模式

我通过将x1x2改为函数来解决问题,但是有不同的方法让Visual Studio正确推断列表的类型吗?

1 个答案:

答案 0 :(得分:7)

注释应该是

module M =

    type T1 = A | B

    type T2 =
        | F
        | G
        static member x1 = [T1.A; T1.B]
        static member x2 : List<T1> = [] 

因为您正在注释返回类型