私は次の構造体を作成してから、時刻と値のプロパティを変更して、変更可能な値x.Time_とx.Value_を変更します。私は、後のコードでセッターのいずれかを使用しようとすると、しかしF#変更可能な値は変更可能ではありません
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=...'
私は変数が既に変更可能で、構造体がコンパイルされているからです。私は何が欠けていますか?
EDIT
[OK]を、私はそれは問題ではありませんでしたと思ったので、私は私の例を簡略化しますが、私は今、それがないことがわかります。私は実際に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の構造体のデザインガイドラインでは、可変値型を避けることをお勧めします。https://msdn.microsoft.com/en-us/library/ms229031(v=vs.110).aspx変更可能な構造体を作ることで混乱の世界になります。https://blogs.msdn.microsoft.com/ericlippert/2008/05/14/mutating-readonly-structs/ – TheInnerLight
意味があります。構造体を通常のクラスに変更しました。ありがとう。 – user3685285