C#out关键字无法分配给局部变量

时间:2012-10-15 13:32:57

标签: c# out

我的一个方法接受out 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”,因为它是许多其他项目引用的构造函数的一个参数!我认为这可能意味着我被塞满了

5 个答案:

答案 0 :(得分: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)) {...}

答案 1 :(得分:2)

out的要点是必须为传入的out变量分配值。

如果您的评论显示,这是一个选项,那么您不应该使用out

为了分配值,只需正常传递值:

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

既然你已经澄清了你的用例,我会说你还需要从构造函数中重构out。首先,看看重载构造函数 - 有一个可以在没有out的情况下使用的重载,并开始将调用站点更改为具有out参数的站点,直到您将它们全部清除为止。

答案 2 :(得分:2)

好吧,out表示变量进入 uninitialized 方法,因此必须在使用之前对其进行初始化。

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

基本相同
int Demo()
{
    return ...;
}

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

答案 3 :(得分:2)

out的意思是该方法的值 out ,而不是进入.c#编译器阻止你这样做的原因完全相同它阻止了以下编译 - i未初始化

int i;    int k = i;

如果要使用此参数将值传递给此方法,则需要使用ref(以便在中传递值),或者只删除完全out(以便只将值传递给此方法)

答案 4 :(得分:0)

这就是 out 的重点。在函数返回之前,必须为其赋值。如果您不喜欢此行为,请完全跳过它或使用 ref 关键字。