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


Use of unassigned out parameter, c#

我有一个很简单的问题。我为你做了一个非常简单的函数来演示我的问题。

1
2
3
4
5
6
7
8
9
10
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;
}

错误:

Use of unassigned out parameter 'newMAt' The out parameter 'newMAt'
must be assigned to before control leaves the current method

我不知道问题出在哪里。


如果数组是在函数外部定义的,那么应该使用ref(或者不使用,因为数组是引用类型)。out表示参数在返回前将在函数中初始化。一些使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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之间的区别,你可以在.NET中读取ref和out参数之间的区别。


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

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

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

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

nbsp;

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

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

显然,变量永远不会被赋值,这很糟糕。

nbsp;

这将为您提供三个选项:

  • 每次调用方法并使用void mynewMatrix(ref double[,] d)时都分配变量。
  • 在方法内部分配变量一次,然后使用void mynewMatrix(out double[,] d)
  • 每次调用方法并使用void mynewMatrix(double[,] d)时都分配变量。
  • 第三个选项将起作用,因为到目前为止,您不需要Seam来重新分配变量。显然,随着代码变得更加复杂,这可能会发生变化。我想你一开始就有理由使用out


    错误消息是明确的-您需要在方法内为out参数赋值:

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

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

    1
    2
    3
    4
    5
    static void Main(string[] args)      
    {
        double[,] mydouble;
        mynewMatrix(out mydouble);
    }


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

    1
    d =  new double[1, 4];