2016-03-15 5 views
4

Мне нужно назначить параметр byref, но, используя F # 4.0 и .NET 4.5.2 в окне Windows 8x64, я продолжаю получать жалобы, что This value is not mutable. я не могу изменить подпись, потому что я реализующий COM-интерфейс. Минимальный сломанный пример:F # byref param not mutable

module Utils = 
    let bugFix1([<System.Runtime.InteropServices.Out>] ID : System.String byref) = ID <- "Hi!" 
    let bugFix1([<System.Runtime.InteropServices.Out>] ID : int byref) = ID <- 0 
    let bugFix1([<System.Runtime.InteropServices.Out>] ID : System.Guid byref) = ID <- System.Guid.NewGuid() 

По this value, это определенно означает ID, потому что это не имеет значения, что я назначить ID. Также обратите внимание, что не имеет значения, является ли тип blittable или нет, или выделено ли оно или в виде стека.

Есть ли способ заявить ID как mutable?

+0

возможно дубликат или, по крайней мере, аналогичный http://stackoverflow.com/questions/946338/f-how-do-i-declare-and-use-byref-semantics-on-parameters –

+1

Что вы используете для версии F # ? –

+0

@FyodorSoikin Хорошая точка - 4.0. Я редактировал вопрос, чтобы включить это. –

ответ

4

Я думаю, что вы обнаружили еще одну ошибку (или недокументированную функцию?). Это происходит просто потому, что имя параметра заглавное. Сюрприз! :-)

Эти варианты будут работать (опущена [<Out>] для краткости):

let bugFix1(id : string byref) = id <- "Hi!" 
let bugFix1(iD : string byref) = iD <- "Hi!" 

Но это не получится:

let bugFix1(Id : string byref) = Id <- "Hi!" 
let bugFix1(ID : string byref) = ID <- "Hi!" 

Я абсолютно не знаю, почему капитализация будет неважно. Я бы предположил, что это никогда не возникало раньше, потому что параметры всегда начинаются с буквы нижнего регистра по соглашению.

Я собираюсь еще раз поработать с Google, а затем зарегистрировать проблему.

+0

Ничего себе! Это должно научить меня не извлекать выгоду из моих сокращений! Благодарю. –

+0

Если вы открыли проблему, не могли бы вы добавить ссылку здесь? – Asik