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

使用输出参数调用方法时的C#-转换,c#,C#,免责声明:不是专业开发人员 我们正在使用SSI来提取消息RabbitMQ,我已经成功地构建了一个C#脚本组件,它使用queue.Dequeue()从队列中提取和弹出消息。到目前为止,一切顺利。但是,我们希望有某种形式的自动检查,这样我们的SSIS组件就不会连续运行,而是可以计划每n分钟运行一次 我为此找到了Dequeue(int timeout,out object result)方法,并成功地实现了这样的方法:(我们希望使用basiocdeliveredeventargs结果来处理消息体) 这

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

我们正在使用SSI来提取消息RabbitMQ,我已经成功地构建了一个C#脚本组件,它使用
queue.Dequeue()
从队列中提取和弹出消息。到目前为止,一切顺利。但是,我们希望有某种形式的自动检查,这样我们的SSIS组件就不会连续运行,而是可以计划每n分钟运行一次

我为此找到了
Dequeue(int timeout,out object result)
方法,并成功地实现了这样的方法:(我们希望使用basiocdeliveredeventargs结果来处理消息体)

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

myConsumer.Queue.Dequeue(millisecondsTimeout: 500
     , result:out (BasicDeliverEventArgs)message)
但这会导致指定无效参数的错误。有人能解释一下为什么它会抛出那个错误,以及为什么那个语法是无效的吗?

你不能这样做:

myConsumer.Queue.Dequeue(millisecondsTimeout: 500
 , result:out (BasicDeliverEventArgs)message)
因为
出列
方法允许将任何
对象
分配给
消息
参数-它可能是一个
“字符串”
,等等-这将导致非常严重的问题™.

所以不:你不能这么做。

你不能这么做:

myConsumer.Queue.Dequeue(millisecondsTimeout: 500
 , result:out (BasicDeliverEventArgs)message)
因为
出列
方法允许将任何
对象
分配给
消息
参数-它可能是一个
“字符串”
,等等-这将导致非常严重的问题™.


因此,否:您不能这样做。

方法接受第二个参数中的
对象类型。但是您正在传递一个
BasicDeliverEventArgs
类型。这就是为什么会出现错误。如果队列中有
Employee
SomeotherType
,该方法将无法将其分配给
BasicDeliverEventArgs
引用

在方法返回后,调用方可以将其转换为所有权

另请阅读MSDN中的以下引用:

out关键字导致参数通过引用传递。它与ref关键字类似,只是ref要求在传递变量之前对其进行初始化。要使用out参数,方法定义和调用方法都必须显式使用out关键字


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

方法
Dequeue
接受第二个参数中的
object
类型。但是您正在传递一个
BasicDeliverEventArgs
类型。这就是为什么会出现错误。如果队列中有
Employee
SomeotherType
,该方法将无法将其分配给
BasicDeliverEventArgs
引用

在方法返回后,调用方可以将其转换为所有权

另请阅读MSDN中的以下引用:

out关键字导致参数通过引用传递。它与ref关键字类似,只是ref要求在传递变量之前对其进行初始化。要使用out参数,方法定义和调用方法都必须显式使用out关键字


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

因为C#语言规范是这样说的。类型化队列不是更有帮助吗?@PatrickHofman什么是类型化队列?只是在谷歌上搜索了一下,但我没有立即看到任何能解释更多的东西。至于早些时候的评论,这很公平。我希望找到一个解释,为什么它会这么说。
Queue
。研究泛型。@SchmitzIT既然你对学习感兴趣,请看我放在一起的这篇文章,它将解释为什么。因为C#语言规范这么说。类型化队列不是更有帮助吗?@Patrickhoffman什么是类型化队列?只是在谷歌上搜索了一下,但我没有立即看到任何能解释更多的东西。至于早些时候的评论,这很公平。我希望找到一个解释,为什么它会这么说。
Queue
。看看泛型。@SchmitzIT既然你对学习感兴趣,请看我放在一起的这篇文章,它将解释为什么。Does
VeryBadThings™表示某种东西?^^^理论上,编译器可以将Dequeue()的
对象
赋予它,并在方法之后/期间将其转换为调用者参数。这将是范围等方面的一个大混乱。@HenkHolterman这也将是
ref
etc的秘密实现的一个大混乱-在更微妙的场景中产生后果™表示某种东西?^^^理论上,编译器可以将Dequeue()的
对象
赋予它,并在方法之后/期间将其转换为调用者参数。这将是范围等方面的一个大混乱。@HenkHolterman这对于
ref
etc的隐蔽实现也将是一个大混乱-在更微妙的场景中会产生后果