2009-10-22 60 views
4

我熟悉用于传递简单的数据类型进行操作,但我似乎无法弄清楚如何通过这个Queue<>而不会导致编译错误。有任何想法吗?出错的C#语法功能参数

代码:

Queue<SqlCommand> insertScriptQueue = new Queue<SqlCommand>(); 

private void UpdateDefaultIndicator(int newDefaultViewID, 
            out (Queue<SqlCommand>) insertScriptQueue) 

UpdateDefaultIndicator(newViewID, out (Queue<SqlCommand>)insertScriptQueue); 
+1

你得到了什么编译器错误?并尝试省略第二行代码中的()队列。 还可以使用编辑栏上方的101010按钮将代码设置为代码。它使它更好的可读性:) – pyrocumulus 2009-10-22 21:39:54

+0

在调用UpdateDefaultIndicator时,“insertScriptQueue”的类型是什么?看起来你正在投射参数,这与使用'out'一起是非法的。 – 2009-10-22 21:42:54

+1

鉴于此代码存在多个明显问题,如果您可以发布适用于您的代码,那将会很不错。 – 2009-10-22 21:44:29

回答

2

队列会通过引用传递无论如何,它不是一个值类型的内部分配insertScriptQueue某种价值。只是不要使用'出'。更新:请原谅我,我正在考虑'ref' - 但事实上,您传递的是一个Queue数据类型,而不仅仅是一个未分配的引用,这让我认为您无论如何都想使用'ref'。除非你不需要使用'ref',因为Queue不是一个值类型;其默认情况下已经通过'参考'传递。

+1

它不会被“通过引用”传递 - 引用将通过值传递。这是一个微妙的差异,但是一个重要的差异。 “ref”和“out”对于参考类型仍然很重要。请参阅http://pobox.com/~skeet/csharp/parameters.html – 2009-10-22 22:13:44

+0

谢谢!优秀的细节。所以Queue是一个引用类型,'ref'参数的必要性取决于他是否将该参数设置为其函数中的另一个Queue对象,并且期望调用者看到新对象。 – Bruce 2009-10-22 23:59:34

4

你不应该被初始化了变量。如果您需要修改范围内变量,请改为使用ref。

正如Ed在他的评论中指出的那样,“修改”可能不会让你对这里发生的事情有个全面的了解 - 引用类型的out参数将在函数调用结束时定义为初始化对象。正如大多数其他答案指出的,如果你想传入一个初始化对象,ref是更强的选择。

+0

你真的是指“如果你需要修改一个值类型的变量或者为参考类型指定一个新的对象参数” – 2009-10-22 21:43:54

+0

我检查了文档,它似乎确实可以初始化一个out变量;大概当旧的值的引用在函数返回一个新的时候被丢弃。 – Bruce 2009-10-22 21:47:40

3
Queue<SqlCommand> insertScriptQueue; 

private void UpdateDefaultIndicator(int newDefaultViewID, 
           out Queue<SqlCommand> insertScriptQueue){/*body*/} 

UpdateDefaultIndicator(newViewID,out insertScriptQueue); 

这对我来说工作正常......你得到什么错误?

3

为什么你想要一个“出”......在这里...为什么你不返回类型呢?让方法返回Queue <> insteasd的void ..会为你工作吗?

5

您正在传入参考类型。无需使用。

+1

'out'与传递引用类型有什么关系? 'out'修饰符只允许你使用一个未初始化的变量(可以是一个值类型或引用类型)并确保它在方法本身中被初始化。 – LukeH 2009-10-22 21:55:54

+0

好的;在这个特定的上下文中不需要使用OR或者ref。在传递它之前,他已经初始化了他的变量。 – gn22 2009-10-22 21:57:31

0

确保您在UpdateDefaultIndicator方法

0

顺便提一下,原始问题的答案是您正在投射到队列,并且演员正在返回临时参考。该引用不可分配,因此不是合法的输出参数。 Erich的代码实现了这个问题的修复。