Семантика изменяемых структур всегда сбивает с толку, потому что в некоторых ситуациях структура неожиданно копируется, когда вы используете ее определенным образом, поэтому рекомендуется избегать мутаций внутри структур.
Вы можете сделать это, пометив переменную x
внутри noCounty
изменяемой. Учитывая ваше текущее определение Counter
, следующее работает как ожидалось:
let noCounty() =
let mutable x = new Counter()
x.Incr()
x.Incr()
x.Count
Я согласен, это довольно странно. Я думаю, что логика заключается в том, что если вы определяете переменную как неизменную, то компилятор копирует значение структуры в новую переменную перед тем, как выполнить любой вызов, который может ее изменить. В результате скомпилированный код выглядит примерно так:
let noCounty () =
let x = new Counter()
(let t1 = x in t1.Incr())
(let t2 = x in t2.Incr())
(let t3 = x in t3.Count)
Я ожидаю, что компилятор предупредит меня об этом - поэтому, возможно, отсутствие предупреждения в этом случае следует сообщать как ошибку компилятора. (Хотя поведение, вероятно, предназначено.)