type SQLConn =
val mutable private connection : string option
member this.Connection
with get() : string = this.connection.Value
and set(v) = this.connection <- Some v
new (connection : string) = {connection = Some connection;}
new() = SQLConn @"Data Source=D:\Projects\AL\Service\ncFlow\dbase\dbflow.db3; Version=3;Password=432432434324"
我想在那里使用“let x = 5 + 5”或类似的东西,所以如何在我的类型(类)(记录)中使用私有函数,我知道如果我做SQLConn我可以使用它们( ),但后来我不能使用val,我想同时使用:val和let ...
谢谢
答案 0 :(得分:2)
错误消息解释了问题:
错误FS0963:除非使用隐式构造序列,否则不允许在类定义中使用'let'和'do'绑定。您可以通过修改类型声明来包含参数来使用隐式构造序列,例如'type X(args)= ...'。
错误消息表明您将类声明为type SQLConn(connection) =
。如果你这样做,你可能应该删除member this.Connection
属性,因为你将不再有一个可变字段。
更可能的解决方法是将x声明为val x : int
,然后将x = 5 + 5;
初始化程序放在构造函数中。
答案 1 :(得分:2)
Tim解释说,您只能使用隐式构造函数语法的本地let
绑定。我肯定会遵循这种方法,因为它使F#代码更具可读性。
您是否有任何特殊原因要在代码中使用val
?您仍然可以使用隐式构造函数语法来使用它们,但它们必须是可变的并使用变异初始化:
type SQLConn(connection:string) as x =
let mutable connection = connection
// Declare field using 'val' declaration (has to be mutable)
[<DefaultValue>]
val mutable a : int
// Initialize the value imperatively in constructor
do x.a <- 10
member this.Connection
with get() = connection and set(v) = connection <- v
new() = SQLConn @"Data Source=.."
据我所知val
只需要创建非私有的字段(某些基于代码的工具可能需要这些工具,如ASP.NET,但其他方面并不实用)。 / p>
答案 2 :(得分:1)
以下情况如何?
type SQLConn(conn:string) =
// could put some other let bindings here...
// ex: 'let y = 5 + 5' or whatever
let mutable conn = conn
new() = SQLConn(@"some default string")
member __.Connection
with get () = conn and set v = conn <- v