我喜欢使用Microsoft.Exchange.WebService API:

C#工作正常

ExchangeService service = new ExchangeService(userData.Version);
service.Credentials = new NetworkCredential(userData.EmailAddress, userData.Password);

F#给出错误:类型'NetworkCredential'与'ExchangeCredential'不兼容
open System
open Microsoft.Exchange.WebServices.Data
open System.Net

[<EntryPoint>]
let main argv =

    let connectToService userData =
        let service = new ExchangeService(userData.Version)
        do
            service.Credentials <-  new NetworkCredential(userData.EmailAddress, userData.Password)
            service.Url <- userData.AutodicoverUrl
    0

我认为这与C#API中定义的隐式转换有关。所以我尝试了(:>)和下调(:?>)。我试图使它显式化(新的NetworkCredential ...:ExchangeCredentials),并且已经检查了直接在C#nuget和F#包中使用的引用的dll。
两者都在VS 2015中进行了测试。在C#中是.Net 4.5.2,在F#中也是如此,如果这是在app.config中查找它的正确方法,也是如此。
 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />

而且我猜想使用WebCredentials不是正确的方法。我想使用SecureString而不是字符串,并且可以在C#中使用。因此,很可能我想理解的F#语法有问题。

最佳答案

您已经注意到ExchangeCredentials定义了从NetworkCredentialsExchangeCredentials的隐式转换,这就是为什么您的代码可以在C#中正常运行的原因。请注意,这两件事之间没有继承关系,因此不能使用upcast(:>)和downcast(:?>)运算符。

隐式转换在F#中以静态成员 op_Implicit 的形式出现。

let connectToService userData =
    let service = new ExchangeService(userData.Version)
    service.Credentials <-
        NetworkCredential(userData.EmailAddress, userData.Password)
        |> ExchangeCredentials.op_Implicit // call implicit conversion
    service.Url <- userData.AutodicoverUrl

10-07 16:05