在 C# 中一般访问多维数组

Sha*_*sky 5 c# arrays generics

C# 允许创建和填充多维数组,这是一个简单的例子:

    public static void Main(String[] args)
    {
        var arr = (int[,])CreateArray(new [] {2, 3}, 8);
        Console.WriteLine("Value: " + arr[0,0]);
    }

    // Creates a multidimensional array with the given dimensions, and assigns the
    // given x to the first array element
    public static Array CreateArray<T>(int[] dimLengths, T x)
    {
        var arr = Array.CreateInstance(typeof(T), dimLengths);
        var indices = new int[dimLengths.Length];
        for (var i = 0; i < indices.Length; i++)
            indices[i] = 0;
        arr.SetValue(x, indices);  // Does boxing/unboxing
        return arr;
    }
Run Code Online (Sandbox Code Playgroud)

这很好用。但是,由于某种原因,没有 Array.SetValue() 的通用版本,因此上面的代码执行装箱/拆箱,我想避免这种情况。我想知道我是否遗漏了什么,或者这是否是 .NET API 中的遗漏?

Age*_*ire 0

我没有找到任何通用方法来将值设置到 Array 实例中,所以我想唯一的解决方法是使用不安全的上下文来避免装箱。

然而,现在我想起来,不可能有通用版本。看,当您定义通用方法时method<T>()...,您确实定义了该方法的参数:...<T>(T[] a)...您必须在其中具体说明维度计数,即1。要创建二维参数,您可以像这样定义它,...<T>(T[,] a)...依此类推。

正如您所看到的,按照 C# 的当前语法,您无法简单地创建可以接受任意维数组的泛型方法。