我的一个方法接受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”,因为它是许多其他项目引用的构造函数的一个参数!我认为这可能意味着我被塞满了
答案 0 :(得分:3)
如果我们改为:
,原因将更加明显Other o = new Other();
int i;
o.Demo(out i);
Console.WriteLine(i);
您会注意到i
在电话之前没有“明确分配”,并且在电话后“明确分配”。更一般地说,因此,在进入方法体时,out
参数不是“明确赋值的”。您必须为参数指定一个值:
如果您想在中传递值,请使用ref
代替out
。
请注意,技术上 ref
和out
在实施方面是相同的;明确赋值的特殊处理是编译器功能,旨在避免我们必须使用虚拟值进行初始化,例如:
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 关键字。