【问题标题】:Use of unassigned out parameter, c#使用未分配的输出参数,c#
【发布时间】:2011-10-11 10:54:52
【问题描述】:

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

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” 必须在控制离开当前方法之前分配给

不知道哪里出了问题。

【问题讨论】:

  • 错误信息非常明确。请准确描述您不理解的内容。
  • 我没有看到任何newMAt 参数。

标签: c#


【解决方案1】:

如果数组是在函数之外定义的,你应该使用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

【讨论】:

    【解决方案2】:

    在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)

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

    【讨论】:

      【解决方案3】:

      错误信息很清楚 - 您需要在方法中为 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);
      }
      

      【讨论】:

      • 不仅在返回之前,而且在方法中从d 读取之前。
      【解决方案4】:

      您正在为数组参数的元素分配值,但您必须为数组本身分配 y 值,因为它定义为 out:

      d =  new double[1, 4];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        相关资源
        最近更新 更多