2012-02-09 48 views
2

上市Script.fsx「不是從這個代碼位置訪問」:F#方法指針

#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): error FS0503: The member or object constructor 'BeginCreateQueue' taking 3 arguments are not accessible from this code location. All accessible versions of method 'BeginCreateQueue' take 3 arguments.

因此它告訴我,有3個參數的方法是不可訪問,但有3個參數的可訪問版本?

回答

2

BeginCreateQueue有兩個公共過載。我的猜測是類型推理很難猜測你想要哪一個。嘗試添加類型註釋:

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

如果這不是你想要的過載,嘗試stringQueueDescription

+0

這工作,雖然有不同的包圍!我想,因爲我通過FromBeginEnd一個字符串,它會知道選擇與字符串重載?爲什麼不呢? – Henrik 2012-02-09 18:42:11

+1

我認爲答案是:在使用'BeginCreateQueue'的時候,'name'的類型尚未被推斷出來。類型推斷只能使用可用的類型信息_to_到使用點。鑑於此,向'name'('FromBeginEnd(name:string,...')添加一個類型註釋應該可以修復它(並且需要更少的輸入) – Daniel 2012-02-09 20:30:05

+0

正確,這意味着如果我寫'queueDescription' '我不會得到錯誤? – Henrik 2012-02-10 09:07:20