使用未分配的输出参数,c#

时间:2011-10-11 10:54:53

标签: c#

我有一个非常简单的问题。 我为你演示了一个非常简单的功能。

static void Main(string[] args)       
{
    double[,] mydouble = new double[1, 4];
    mynewMatrix(out mydouble);
}
public static void mynewMatrix(out double[,] d)
{
    for (int i = 0; i < 4; i++)
        d[0, i] = i;
}

错误:

  

使用未分配的输出参数'newMAt'输出参数'newMAt'   必须在控制离开当前方法之前分配给

我不知道问题出在哪里。

4 个答案:

答案 0 :(得分:82)

如果数组是在函数的OUTSIDE中定义的,那么你应该使用ref(或者没有,考虑到数组是引用类型)。 out表示参数将在返回之前在函数中初始化。一些使用示例:

static void Main(string[] args)
{
    double[,] mydouble;
    mynewMatrix(out mydouble);// call of method

    double[,] mydouble2 = new double[1, 4];
    mynewMatrix2(mydouble2);// call of method

    // useless for what you want to do
    mynewMatrix3(ref mydouble2);// call of method
}

public static void mynewMatrix(out double[,] d)
{
    d = new double[1, 4];

    for (int i = 0; i < 4; i++)
    {
        d[0, i] = i;
    }
}

public static void mynewMatrix2(double[,] d)
{
    for (int i = 0; i < 4; i++)
    {
        d[0, i] = i;
    }
}

// useless for what you want to do
public static void mynewMatrix3(ref double[,] d)
{
    for (int i = 0; i < 4; i++)
    {
        d[0, i] = i;
    }
}

我想补充一点,如果你不知道refout之间有什么区别,你可以阅读Difference between ref and out parameters in .NET

答案 1 :(得分:19)

在c#中有两个非常相似的关键字refout

它们都通过引用传递值,但区别在于:

使用ref时,编译器会要求您在调用方法之前分配变量。

使用out时,不需要这样做。这意味着您将无法假定参数已经填充。您将无法在方法中读取其值。

为了说明问题,想象一下如果其他人编写此代码来调用您的方法会发生什么:

double[,] myUnassignedDouble;
mynewMatrix(out myUnassignedDouble);

显然,永远不会分配变量,这很糟糕。

这为您提供了三个选项:

  1. 每次调用方法时分配变量并使用void mynewMatrix(ref double[,] d)
  2. 在方法内分配变量一次,然后使用void mynewMatrix(out double[,] d)
  3. 每次调用方法时分配变量并使用void mynewMatrix(double[,] d)
  4. 第三个选项可以正常工作,因为到目前为止你还没有需要重新分配你的变量。显然,随着代码变得更加复杂,可能会发生变化。我假设您确实有理由首先使用out

答案 2 :(得分:4)

错误消息是明确的 - 您需要为方法中的out参数指定一个值:

public static void mynewMatrix(out double[,] d)
{
    d = new double[1, 4];
    for (int i = 0; i < 4; i++)
    {
        d[0,i]=i;
    }
}

您在方法之外进行的分配无效。写下这个:

static void Main(string[] args)       
{
    double[,] mydouble;
    mynewMatrix(out mydouble);
}

答案 3 :(得分:1)

您正在为数组参数的元素赋值,但您必须将y值赋给数组本身,因为它定义为out

d =  new double[1, 4];