为什么动态分配数组的大小必须是静态字段?

Ond*_*ták 1 .net c#

我有一个虚拟类,我正在测试数组.我注意到,当我想在运行时动态分配数组大小时,指示此大小的字段必须是静态的.我知道我应该使用这种代码的集合,但我更感兴趣为什么这些字段必须是静态的?这背后有什么特别的原因吗?

class Foo
{
    private static int x;
    private static int y;

    private int[,] bar = new int[ x, y ];

    public Foo( int a, int b )
    {
        x = a;
        y = b;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

它们实际上不必是静态的 - 只是你不能在实例变量初始化器中引用其他实例变量.换句话说,它有点像这样:

class Foo
{
    private int x;
    private int y = x; // Invalid
}
Run Code Online (Sandbox Code Playgroud)

从C#3规范的10.5.5.2节:

实例字段的变量初始值设定项无法引用正在创建的实例.因此,在变量初始化程序中引用它是一个编译时错误,因为变量初始化程序通过简单名称引用任何实例成员是编译时错误.

我怀疑你真的想要这样的东西:

class Foo
{
    private int x;
    private int y;

    private int[,] bar;

    public Foo( int a, int b )
    {
        x = a;
        y = b;
        bar = new int[x, y];
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,你并不真正需要x,并y在所有-他们只是方便,以保持阵列的每个维度.你可以使用bar.GetLength(0)bar.GetLength(1)获得两个长度,但这并不是非常令人愉快.

你可能要重新命名x,并ywidthheight,虽然,或类似的东西:)