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

Sha*_*gee 45 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;
}
Run Code Online (Sandbox Code Playgroud)

错误:

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

我不知道问题出在哪里.

xan*_*tos 86

如果数组是在函数的OUTSIDE中定义的,则应该使用a 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我要补充说,如果你不知道它们之间有什么区别ref,out你可以阅读.NET中ref和out参数之间的区别


Buh*_*ica 19

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

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

使用ref编译器时,需要在调用方法之前分配变量.

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

 

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

double[,] myUnassignedDouble;
mynewMatrix(out myUnassignedDouble);
Run Code Online (Sandbox Code Playgroud)

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

 

这为您提供了三个选项:

  1. 每次调用方法并使用时分配变量 void mynewMatrix(ref double[,] d)
  2. 在方法和使用中分配变量一次 void mynewMatrix(out double[,] d)
  3. 每次调用方法并使用时分配变量 void mynewMatrix(double[,] d)

第三个选项将起作用,因为到目前为止,您不需要重新分配变量.显然,随着代码变得更加复杂,可能会发生变化.我假设你确实有你的理由out首先使用?


Mar*_*ers 5

错误消息很清楚 - 您需要为方法内的 out 参数分配一个值:

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

您在方法外部进行的分配无效。就这样写:

static void Main(string[] args)       
{
    double[,] mydouble;
    mynewMatrix(out mydouble);
}
Run Code Online (Sandbox Code Playgroud)

  • 不仅在返回之前,而且在方法内从“d”*读取*之前。 (5认同)