0

我有一个这样的方法声明:

public int myMethod(int x, out int y, out int z)
{
    int k;
    foreach(int i in someList)
    {
        if(anotherMethod(out k))
        {
            z = k;
        }
        else
        {
            z = 0;
        }
    }

    y = someValue;

    return anotherValue;
}

但我得到这个编译错误

必须在控制离开当前方法之前分配 out 参数“z”

4

3 回答 3

4

如果someList为空,则永远不会进入foreach循环,因此z永远不会被赋值。要解决此问题,请确保z无论 的内容如何,​​都给它一个值someList

public int myMethod(int x, out int y, out int z)
{
    z = 0; // or whatever default value you like

    ...
}

但是,您可能应该考虑重构此代码。可能有更好的方法来实现这一点。如果您真的想返回 3 个不同的int值,您可以考虑使用 aTuple<int, int, int>或创建自定义数据类型来表示该值。

于 2013-11-06T06:07:29.590 回答
1

原因:必须在从函数返回之前初始化 out 参数。

您正在为 if 块内的参数 z 赋值,因此编译器无法识别它是否可以初始化,因此在 if 块之前初始化您的参数 z ,如下所示:

public int myMethod(int x, out int y, out int z)
{
    int k;
    z=0;
    foreach(int i in someList)
    {

        if(anotherMethod(out k))
        {
            z = k;
        }
        else
        {
            z = 0;
        }
    }

    y = someValue;

    return anotherValue;
}
于 2013-11-06T06:15:34.413 回答
0

如果someList为空,则z永远不会被分配一个值,这违反了它是一个out变量。删除out约束,或重新配置您的功能逻辑。

于 2013-11-06T06:09:13.593 回答