C# - 使用输出参数调用方法时的转换

时间:2017-06-06 11:06:17

标签: c#

免责声明:不是专业开发人员

我们正在使用SSIS来提取RabbitMQ消息,并且我设法构建了一个C#脚本组件,使用Queue.Dequeue()从我们的队列中拉出和弹出消息。到现在为止还挺好。但是,我们希望采用某种形式的自动检查,因此我们的SSIS组件不会连续运行,而是可以安排每n分钟运行一次。

我为此找到了Dequeue(int timeout, out object result)方法,并设法实现它:(我们喜欢BasiocDeliverEventArgs结果以处理消息正文)

object message;
myConsumer.Queue.Dequeue(millisecondsTimeout: 500, result:out message);
BasicDeliverEventArgs ea = (BasicDeliverEventArgs)message;

这似乎有效,但我觉得有些多余。例如,这对我来说似乎更直观:

myConsumer.Queue.Dequeue(millisecondsTimeout: 500
     , result:out (BasicDeliverEventArgs)message)

但是这会产生指定无效参数的错误。有人可以解释为什么会抛出该错误,以及为什么该语法无效?

2 个答案:

答案 0 :(得分:2)

你不能这样做:

myConsumer.Queue.Dequeue(millisecondsTimeout: 500
 , result:out (BasicDeliverEventArgs)message)

因为允许Dequeue方法将任何 object分配给message参数 - 它可能是"string"等 - 其中会导致VeryBadThings™。

所以不是:你不能这样做。

答案 1 :(得分:1)

Dequeue方法在第二个参数中接受object类型。但是你传递的是BasicDeliverEventArgs类型。这就是你得到错误的原因。如果队列中有EmployeeSomeotherType,该方法将无法将其分配给BasicDeliverEventArgs引用。

在方法返回后,调用者将要转换它。

另请阅读MSDN上的这句话:

  

out关键字导致参数通过引用传递。它类似于ref关键字,除了ref要求变量在传递之前被初始化。要使用out参数,方法定义和调用方法都必须显式使用out关键字

在c#中,几乎所有内容都继承object,因此您调用的方法可以将任何类型存储在object引用中(只要它们继承了对象)并将其返回给您。但是它不能在BasicDeliverEventArgs引用中存储任何类型,这就是为什么它不允许它。