2

我的一种方法接受 aout int i作为参数。我需要获取此变量的值并将其分配给局部变量。

考虑以下演示该问题的简单控制台应用程序:

class Program
    {
        static void Main(string[] args)
        {
            Other o = new Other();
            int i = 5; 
            o.Demo(out i);
            Console.WriteLine(i);
            Console.ReadKey();
        }
    }

    class Other
    {
        public void Demo(out int i)
        {
            // i = 10; Uncomment this to fix it (although this would not be an option)
            int k = i;            
        }
    }

我无法将变量 i 分配给 k(在 Demo 方法中)。有没有人有解释(和解决方法:))。

编辑

以上只是我正在尝试做的一个人为的例子:在现场,问题是我正在重写代码,在这个阶段,我无法更改“out”,因为它是其中之一许多其他项目引用的构造函数的参数!我想这可能意味着我吃饱了

4

5 回答 5

3

如果我们改为:

Other o = new Other();
int i;
o.Demo(out i);
Console.WriteLine(i);

您会注意到在通话之前i不是“明确分配”的,而是在通话之后“明确分配”的。更一般地,因此,参数在进入方法体时不是“明确分配”的。您必须为参数分配一个值:out

  • 在你尝试阅读之前(如果有的话)
  • 退出前(不包括例外)

如果您还想传递一个值请使用ref而不是out.

请注意,在技术上 refout在实现方面是相同的;明确赋值的特殊处理是一个编译器特性,旨在避免我们必须使用虚拟值进行初始化,例如:

int i = 0; // why zero? this zero is useless and never used!
if(int.TryParse(s, out i)) {...}

更好的:

int i;
if(int.TryParse(s, out i)) {...}
于 2012-10-15T13:38:43.367 回答
2

关键out是您必须为传入的out变量赋值。

如果正如您的评论所暗示的那样,这不是一个选项,那么您不应该使用out它。

为了分配值,只需像往常一样传入值:

class Other
{
    public void Demo(int i)
    {
        int k = i;            
    }
}

现在您已经阐明了用例,我想说您仍然需要out从构造函数中重构。首先,查看构造函数的重载 - 有一个可以不使用的重载,out然后开始将调用站点更改为带out参数的调用站点,直到您将它们全部清除。

于 2012-10-15T13:35:47.913 回答
2

好吧,out意味着变量进入方法uninitialized,所以在使用它之前必须对其进行初始化。

的含义out是变量由过程设置。对于您的代码,它基本上与

int Demo()
{
    return ...;
}

请注意,返回上面示例中的值通常优于通过out参数返回。

于 2012-10-15T13:38:15.957 回答
2

关键out是该值来自方法,而不是进入。c#编译器阻止您这样做的原因与它阻止以下编译的原因完全相同 -i未初始化

诠释我; 诠释 k = 我;

如果您想使用此参数将值传递给此方法,那么您需要使用ref(以便将值传入传出),或者只是out完全删除(以便仅将值传递给此方法)

于 2012-10-15T13:39:16.217 回答
0

这就是全部的意义。您必须在函数返回之前为其赋值。如果你不喜欢这种行为,要么完全跳过它,要么使用ref关键字。

于 2012-10-15T13:39:39.820 回答