如何在BlockingCollection上使用TryTake方法<'a>以毫秒为单位传递超时时间?
继承人签名:
BlockingCollection.TryTake(item:byref,millisecondsTimeout:int):bool
是否可以使用Tuple方法避免像Dictionary.TryGet方法那样传递ref类型?
即。
让成功,item = myDictionary.TryGetValue(客户端)
我正在努力争取这个特殊的签名,任何建议都会很棒。
干杯!
答案 0 :(得分:3)
我相信您只能对参数列表的 end 中出现的byref
参数使用该技术(这类似于可选参数的规则)。因此,如果使用签名BlockingCollection.TryTake
定义了int * 'T byref -> bool
,那么它会起作用,但由于它定义为'T byref * int -> bool
,因此不会。
例如:
open System.Runtime.InteropServices
type T =
static member Meth1(a:int, [<Out>]b:string byref, [<Out>]c:bool byref) : char =
b <- sprintf "%i" a
c <- a % 2 = 0
char a
static member Meth2([<Out>]b:string byref, [<Out>]c:bool byref, a:int) : char =
b <- sprintf "%i" a
c <- a % 2 = 0
char a
// ok
let (r,b,c) = T.Meth1(5)
// ok
let (r,c) = T.Meth1(5,ref "test")
// ok
let r = T.Meth1(5, ref "test", ref true)
// doesn't compile
let (r,b,c) = T.Meth2(5)
// doesn't compile
let (r,c) = T.Meth2(ref "test", 5)
// ok
let r = T.Meth2(ref "test", ref true, 5)