다음과 같은 구조체가 있습니다.이 구조체는 시간 및 값 속성을 수정하고 수정하여 개인 변경할 수있는 값 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=...'
왜냐하면 변수는 이미 변경 가능하고 구조체는 컴파일되기 때문입니다. 내가 뭘 놓치고 있니?
편집
좋아, 나는 그것이 중요하지 않았다 생각했기 때문에 나는 나의 예를 단순화,하지만 난 지금이하는 것을 알 수있다. 사실 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