F# F“方法指针”;无法从此代码位置访问”;

F# F“方法指针”;无法从此代码位置访问”;,f#,azure,azureservicebus,F#,Azure,Azureservicebus,清单Script.fsx: #load "AccountDetails.fs" #r @"..\packages\FSharpx.Core.1.4.120207\lib\FSharpx.Async.dll" #r @"C:\Program Files\Windows Azure SDK\v1.6\ServiceBus\ref\Microsoft.ServiceBus.dll" #load "AzureServiceBus.fs" open AccountDetails open F

清单Script.fsx:

 #load "AccountDetails.fs"
 #r @"..\packages\FSharpx.Core.1.4.120207\lib\FSharpx.Async.dll"
 #r @"C:\Program Files\Windows Azure SDK\v1.6\ServiceBus\ref\Microsoft.ServiceBus.dll"
 #load "AzureServiceBus.fs"

 open AccountDetails
 open FSharp.Control

 open Microsoft.ServiceBus
 open Microsoft.ServiceBus.Messaging

 // Let's do some service bus hacking
 let tp = TokenProvider.CreateSharedSecretTokenProvider(issuer_name, key)
 let asb_uri = ServiceBusEnvironment.CreateServiceUri("sb", ns, "")
 let mf = MessagingFactory.Create(asb_uri, tp)
 let nm = NamespaceManager(asb_uri, NamespaceManagerSettings(TokenProvider = tp))

 module Queue =
   let queueDescription name = async {
     let! exists = Async.FromBeginEnd(name, nm.BeginQueueExists, nm.EndQueueExists)
     return! if exists then Async.FromBeginEnd(name, nm.BeginGetQueue, nm.EndGetQueue)
             else Async.FromBeginEnd(name, nm.BeginCreateQueue, nm.EndCreateQueue)
     }
我收到以下错误:
Script.fsx(22,43):错误FS0503:无法从此代码位置访问包含3个参数的成员或对象构造函数“BegIncremateQueue”。方法“BegIncremateQueue”的所有可访问版本都有3个参数。


所以它告诉我有3个参数的方法是不可访问的,但是有一个有3个参数的可访问版本?

有两个公共重载
BeginCreateQueue
。我的猜测是类型推断很难猜出你想要哪一个。尝试添加类型批注:

Async.FromBeginEnd(name, 
  nm.BeginCreateQueue : string * AsyncCallback * obj -> IAsyncResult, 
  nm.EndCreateQueue)

如果这不是您想要的重载,请尝试将
QueueDescription
替换为
string

这是有效的,尽管括号不同!我想,既然我传递了FromBeginEnd一个字符串,它就会知道用这个字符串选择重载了吗?为什么没有呢?我想答案是:在使用
BeginCreateQueue
时,尚未推断出
name
的类型。类型推断只能使用到使用点为止的可用类型信息。考虑到这一点,在
name
FromBeginEnd(name:string,
)中添加一个类型注释应该可以解决这个问题(并且需要更少的键入)。对吧,这意味着如果我写了“queueDescription”a,我就不会出错?