【问题标题】:Tricky C# syntax for out function parameterout 函数参数的棘手 C# 语法
【发布时间】:2009-10-22 21:35:36
【问题描述】:

我熟悉使用 out 传递一个简单的数据类型进行操作,但我似乎无法弄清楚如何传递这个 Queue<> 而不会导致编译错误。有什么想法吗?

代码:

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

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

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

【问题讨论】:

  • 您遇到了什么编译器错误?并尝试在第二行代码中省略 Queue 周围的 ()。还可以使用编辑字段上方的 101010 按钮将代码样式化为代码。它使它更具可读性:)
  • 在您调用UpdateDefaultIndicator 时,insertScriptQueue 的类型是什么?看起来您正在转换参数,与使用 out 一起使用是非法的。
  • 鉴于此代码存在许多明显问题,如果您能发布适合您的代码,那就太好了。
  • 罗伯特,将 out 替换为 ref

标签: c# asp.net syntax queue


【解决方案1】:

您正在传递一个引用类型。不用用完。

【讨论】:

  • out 与传递引用类型有什么关系? out 修饰符只允许您使用未初始化的变量(可以是值类型或引用类型)并确保它在方法本身中被初始化。
  • 好的;在这个特定的上下文中不需要使用 out OR ref 。他在传入变量之前已经对其进行了初始化。
【解决方案2】:

您不应该初始化 out 变量。如果您需要修改范围内的变量,请改用 ref。

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

【讨论】:

  • 你的真正意思是“如果你需要修改一个值类型的变量或者为引用类型的参数分配一个新对象”
  • 我检查了文档,看来初始化一个 out 变量实际上是可以的;当函数返回一个新值时,可能会丢弃对旧值的引用。
【解决方案3】:
Queue<SqlCommand> insertScriptQueue;

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

UpdateDefaultIndicator(newViewID,out insertScriptQueue);

这对我来说很好......你遇到了什么错误?

【讨论】:

    【解决方案4】:

    你为什么想要一个“out”...这里...为什么不返回类型呢?让方法返回 Queue 而不是 void..这对你有用吗?

    【讨论】:

      【解决方案5】:

      无论如何,队列将通过引用传递,它不是值类型。只是不要使用'out'。更新:对不起,我在想'ref'——但事实上你传递了一个队列数据类型,而不仅仅是一个未分配的引用,这让我觉得你无论如何都想使用'ref'。当然,您不需要使用“ref”,因为 Queue 不是值类型;默认情况下,它已经将通过“引用”传递。

      【讨论】:

      • 它不会“通过引用”传递 - 引用将通过值传递。这是一个微妙的区别,但很重要。 “ref”和“out”对于引用类型仍然很重要。见pobox.com/~skeet/csharp/parameters.html
      • 谢谢!优秀的细节。因此,虽然 Queue 是一种引用类型,但“ref”参数的必要性取决于他是否将该参数设置为函数中的不同 Queue 对象,并期望调用者看到新对象。
      【解决方案6】:

      确保您在 UpdateDefaultIndicator 方法中为 insertScriptQueue 分配了某种值

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2011-11-28
          • 1970-01-01
          • 1970-01-01
          • 2014-08-13
          • 1970-01-01
          • 1970-01-01
          • 2021-09-18
          • 1970-01-01
          • 2014-05-04
          相关资源
          最近更新 更多