这是代码:
type Advertisement() =
member val Photos = seq<images> with get,set
Run Code Online (Sandbox Code Playgroud)
但是这会返回属性Photos as的函数签名
seq<images> -> seq<images>
Run Code Online (Sandbox Code Playgroud)
我只想要属性来表示一系列图像
seq<images>
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
这里的问题是你想seq<images>用作类型注释,但你将它用作表达式.这些有不同的含义; 此外,还不清楚你想要分配的序列Photos.
例如,如果要初始化Photos为空序列,则可以使用Seq.empty并具有seq<images>类型注释:
member val Photos = Seq.empty : seq<images> with get, set
Run Code Online (Sandbox Code Playgroud)
或者,正如ildjarn建议的那样,使用显式类型参数Seq.empty<'T>:
member val Photos = Seq.empty<images> with get, set
Run Code Online (Sandbox Code Playgroud)
如果Photos在同一代码文件中使用的类型清楚,编译器将推断出类型,您甚至可以将其缩短为:
member val Photos = Seq.empty with get, set
Run Code Online (Sandbox Code Playgroud)
当你写seq<images>一个表达式而不是一个类型(即不在一个:或作为一个类型参数)之后,编译器将其解析为Operators.seq<'T>,这是seq<images> -> seq<images>你得到的签名函数.
实施seq有点奇怪; 它应该表现得像计算表达式,但实际上是编译器的特例.它既可用于seq<'T>通过您所见过的函数进行转换,也可用于表示序列表达式,如seq { yield 1 }.