读书人

关键字out的引述参数,为何必须要使用=

发布时间: 2013-09-06 10:17:17 作者: rapoo

关键字out的引用参数,为何必须要使用=而不能只用+=等操作?
例如,我有下面一小段代码,可以运行没有问题:


class Program
{
static void Increment(out int i,int inc=4)
{
i = 4;
}
static void Main(string[] args)
{
int i = 2;
Increment(out i);
}
}

可是如果我把Increment函数做个修改:

static void Increment(out int i,int inc=4)
{
i += inc;
}

这下编译就有错误了

error CS0269: Use of unassigned out parameter 'i'
error CS0177: The out parameter 'i' must be assigned to before control leaves the current method


这是为什么呢? 我想做的只是把i的赋值变成了+=。而传入之前的i是已经有值的。再说int本身也是一种值对象而不是引用对象啊。

我的需求就是设计一个Increment函数,让输入输出参数增加某个数值。难道C#做不到这一点么?
我的程序改怎么改?
[解决办法]
out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值。
那么你的第二个例子里面当使用+=的时候 需要对i重新赋值在使用.
[解决办法]
out只传出,不传入。
你要的是传出+传入, out换成ref就好了
[解决办法]

static void Increment(out int i,int inc=4)
{
i += inc; 等价于 i=i+inc; //i没赋值,所以出错了
}

------解决方案--------------------


static int x = 0;
static void Increment(int j, out int i, int inc = 4)
{
i = j;
j += inc;
}
static void Main(string[] args)
{
int i = 2;
Increment(i, out x);
}

读书人网 >C#

热点推荐