EWS:NetworkCredential 与 F# 中的 ExchangeCredentials 不兼容

EWS: NetworkCredential not compatible with ExchangeCredentials in F#

我喜欢用 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# paket 中使用的引用的 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# 中正常运行的原因。请注意,这两者之间没有继承关系,因此您不能使用向上转换 (:>) 和向下转换 (:?>) 运算符。

隐式转换在 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