日期:2014-05-17  浏览次数:20871 次

关键字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没赋值,所以出错了
}

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