我喜欢使用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
定义了从NetworkCredentials
到ExchangeCredentials
的隐式转换,这就是为什么您的代码可以在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