将XmlMessageFormatter转换为IMessageFormatter

Jon*_*ats 1 f# msmq c#-to-f#

我正在尝试为F#中的消息设置消息格式化程序.在C#我可以:

    foreach (System.Messaging.Message message in messages)
    {
         message.Formatter = new XmlMessageFormatter(new String[] { "System.String,mscorlib" });
        string body = message.Body.ToString();
        Console.WriteLine(body);
    }
Run Code Online (Sandbox Code Playgroud)

哪个工作得很好.我现在想在F#中做同样的事情,并且:

let mList = messageQueue.GetAllMessages()
let xt = [| "System.String,mscorlib" |]
for m in mList do
    m.Formatter =   XmlMessageFormatter(xt)
Run Code Online (Sandbox Code Playgroud)

这会在编译时导致此错误:

错误2此表达式应具有类型IMessageFormatter,
但此处具有类型XmlMessageFormatter

我怀疑我在F#中缺少一个基本概念.我究竟做错了什么?

--EDIT--拉特金的答案非常有效.为了防止其他人感兴趣,这里是F#中的完整工作程序:

open System.Messaging

[<EntryPoint>]
let main argv = 
    printfn "%A" argv
    let messageQueue = new MessageQueue(".\private$\Twitter")
    messageQueue.MessageReadPropertyFilter.SetAll();
    let mList = messageQueue.GetAllMessages()
    let xt = [| "System.String,mscorlib" |]
    for m in mList do
        m.Formatter <-  XmlMessageFormatter(xt)
        printfn "%s " (m.Body.ToString())
    0 // return an integer exit code
Run Code Online (Sandbox Code Playgroud)

lat*_*kin 6

当您分配可变值时,运算符<-不是=.在F#=中仅用于初始绑定,否则它用作布尔等式运算符(如C系列==).这里有一些文档.

你要

let mList = messageQueue.GetAllMessages()
let xt = [| "System.String,mscorlib" |]
for m in mList do
    m.Formatter <- XmlMessageFormatter(xt)
Run Code Online (Sandbox Code Playgroud)

在这种情况下不需要铸造.

出现错误是因为编译器认为您正在尝试将a IMessageFormatter与a 进行比较XmlMessageFormatter.