Разница в том, что имеется несколько перегрузок конструктора Mutex
, поэтому компилятор считает, что вы вызываете перегрузку, которая принимает ровно два аргумента. Лучше всего объявить изменяемый локальный код и использовать это:
let rec createUniqueMutex i =
let mutable b = false
let mutex = new Mutex(false, string i, &b)
if b then mutex else createUniqueMutex (i+1)
Обратите внимание, что я исправил несколько других проблем с вашим кодом. В частности, вам нужно использовать let rec
для определения рекурсивной функции и вам нужно заключить в скобки (i+1)
.
Редактировать
Просто чтобы показать, что это сработало бы, если бы не перегрузки:
type MyType(x:string, [<System.Runtime.InteropServices.Out>]y:int byref) =
do y <- 3
member __.X = x
let (myT, n) = MyType("test")
В качестве второстепенного замечания, обратите внимание, что кортежи в вашем выражении сопоставления задом наперед: возвращаемое значение идет первым, поэтому они должны быть (_,false)
и (mutex, true)
.