1

我正在尝试为 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);
    }

效果很好。我现在想在 F# 中做同样的事情并拥有:

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

在编译时导致此错误:

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

我怀疑我在 F# 中遗漏了一个基本概念。我究竟做错了什么?

--EDIT-- latkin 的回答完美。以防万一其他人感兴趣,这里是 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
4

2 回答 2

6

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

你要

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

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

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

于 2013-02-20T01:17:09.340 回答
1

F# 没有像 C# 那样的隐式转换,因此它不会自动将您向上转换为属性XmlMessageFormatterIMessageFormatter使用的Formatter

几天前有一个类似的问题,提供了更多信息: F# return ICollection

于 2013-02-20T01:12:25.177 回答