C# 如何避免初始化已初始化的变量?

C# 如何避免初始化已初始化的变量?,c#,arrays,field,C#,Arrays,Field,} 出现与该节相关的错误: namespace text_test { public class txt_program { public class txt { /* 0 */ int[] M_array_0 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* 1 */ int[] M_array_1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0

}

出现与该节相关的错误:

namespace text_test
{
public class txt_program


{
    public class txt
    {

        /* 0 */
        int[] M_array_0 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 1 */
        int[] M_array_1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 2 */
        int[] M_array_2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 3 */
        int[] M_array_3 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 4 */
        int[] M_array_4 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 5 */
        int[] M_array_5 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 6 */
        int[] M_array_6 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 7 */
        int[] M_array_7 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 8 */
        int[] M_array_8 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 9 */
        int[] M_array_9 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 10 */
        int[] M_array_10 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 11 */
        int[] M_array_11 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 12 */
        int[] M_array_12 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 13 */
        int[] M_array_13 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

        int[][] M = { M_array_0, M_array_1 };

    }
}
该错误与上面的M_array_0和M_array_1有关。我不明白的是为什么我不能从上面创建多维数组。我应该使用那个代码吗? 我试过:

int[][] M = { M_array_0, M_array_1 };
错误内容如下:

字段初始值设定项无法引用非静态字段、方法或属性“txt\u program.txt.M\u array\u 0”text\u test\psf\Home\Documents\Visual Studio 2015\Projects\text\u test\text\u test\text.cs 45 Active

提前谢谢你

字段初始值设定项不能引用非静态字段、方法或 属性“字段”实例字段不能用于初始化其他字段 方法外部的实例字段。如果您试图初始化 变量在方法之外,考虑执行初始化。 在类构造函数内部


另请参阅以获取描述性答案。

一种方法是编写一个静态方法,返回所需的数组,并使用该方法分配字段:

string[][] M = { M_array_0, M_array_1 };
double[][] M = { M_array_0, M_array_1 };
或者,您可以像这样以内联方式编写它(但这不太灵活):

由于要将所有数组初始化为相同的大小,并且包含零,因此可以将其缩短为:

public class txt
{
    private int[][] M = 
    {
        new[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // M_array_0
        new[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // M_array_1
        new[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // M_array_3

        // Etc
    };
}
然而,我怀疑这只是您给出的一个示例,在实际代码中,您将使用非零值

还请注意,您可以将
M
声明为只读:

public class txt
{
    int[][] M = 
    {
        new int[14], // M_array_0
        new int[14], // M_array_1
        new int[14], // M_array_2

        // Etc
    };
}
我建议您这样做,除非在创建类实例后需要更改数组本身(而不是内容)。

我建议使用Linq来生成数组

private readonly int[][] M = ...

您应该在中设置这些变量。如果将数组设置为静态,这将起作用。我重新打开了这个问题,因为它看起来更像是创建锯齿状数组,而不是出现错误。
private readonly int[][] M = ...
int[][] M = Enumerable.Range(0, 13) // 13 rows
  .Select(x => new int[13])         // each line contains 13 items
  .ToArray();