【发布时间】:2016-06-29 14:52:28
【问题描述】:
我有以下结构,它应该允许我创建,然后修改时间和值属性,这将改变私有可变值 x.Time_ 和 x.Value_。
type TimeDataPoint =
struct
val mutable private Time_: DateTime
val mutable private Value_: double
new (time: DateTime, value: double) =
{
Time_ = time
Value_ = value
}
member public x.Time
with get() = x.Time_
and set(time: DateTime) = x.Time_ <- time
member public x.Value
with get() = x.Value_
and set(value: double) = x.Value_ <- value
end
但是,当我尝试在以后的代码中使用其中一个设置器时:
let tdp = TimeDataPoint(DateTime.Now, 0.0)
tdp.Time <- DateTime.Now
我收到一个错误:
Invalid mutation of a constant expression. Consider copying the expression to a mutable local, e.g. 'let mutable x=...'
这对我来说没有意义,因为变量已经是可变的,并且结构可以编译。我错过了什么?
编辑
好的,我简化了我的示例,因为我认为这无关紧要,但我现在明白了。我实际上有一个 TimeDataPoints 的 LinkedList,我正在尝试改变一些节点的内容,所以我不能按照建议在本地声明它。这是我的代码:
let myList = LinkedList<TimeDataPoint>()
myList.AddFirst(TimeDataPoint(DateTime.Now, 0.0))
myList.First.Value.Value <- 1.0
我该如何解决这个问题?
【问题讨论】:
-
对我来说非常好用,只要我将
tdp定义为let mutable tdp = TimeDataPoint()。你能发布更多上下文吗? -
你最好的选择是不要走这条路。 .NET 结构设计指南建议您最好避免使用可变值类型:msdn.microsoft.com/en-us/library/ms229031(v=vs.110).aspx 您要求通过制作可变结构来进入一个混乱的世界:blogs.msdn.microsoft.com/ericlippert/2008/05/14/…
-
有道理。我将结构更改为普通课程。谢谢。