我正在尝试为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)
当您分配可变值时,运算符<-不是=.在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.