.Net数组下界> 0

时间:2020-03-05 18:51:25  来源:igfitidea点击:

尽管也许要做一件事情,但我需要在.Net中创建一个下限> 0的数组。起初,似乎可以使用以下方法:

Array.CreateInstance(typeof(Object), new int[] {2}, new int[] {9});

产生所需的结果(将下限设置为9的对象数组)。但是,创建的数组实例不能再传递给期望使用Object []的其他方法,这给了我一个错误:

不能将System.Object [*]强制转换为System.Object []。数组类型的区别是什么?我该如何克服?

编辑:测试代码=

Object x = Array.CreateInstance(typeof(Object), new int[] {2}, new int[] {9});
Object[] y = (Object[])x;

失败的原因是:"无法将类型为'System.Object [*]'的对象转换为类型为'System.Object []'"。

我还想指出,这种方法在使用多个维度时确实有效:

Object x = Array.CreateInstance(typeof(Object), new int[] {2,2}, new int[] {9,9});
Object[,] y = (Object[,])x;

哪个工作正常。

解决方案

回答

我不确定为什么不能将其作为Object []传递,但是如果我们只创建一个实型类来包装数组并在其中处理"怪异逻辑",这将不容易吗?

如果我们可以在类中添加"智能",那么我们将获得使用真正的引用对象的好处。

编辑:我们如何转换数组,可以发布更多代码吗?谢谢。

回答

本文对此进行了解释:http://www.panopticoncentral.net/2004/03/17/non-zero-lower-bounded-arrays-the-other-side-of-the-coin/

回答

我们不能从一个投射到另一个的原因是,这是邪恶的。

假设我们创建了一个object [5..9]数组,并将其作为object []传递给函数F。

函数如何知道这是5..9? F期望一个通用数组,但是得到一个受约束的数组。我们可能会说有可能知道,但这仍然是意外的,人们不想每次使用简单数组时都进行各种边界检查。

数组是编程中最简单的结构,使其过于复杂使其无法使用。我们可能需要其他结构。

我们应该做的是一个类,该类是一个受约束的集合,模仿了我们想要的行为。这样,该类的所有用户都将知道会发生什么。

class ConstrainedArray<T> : IEnumerable<T> where T : new()
{
    public ConstrainedArray(int min, int max)
    {
        array = new T[max - min];
    }

    public T this [int index]
    {
        get { return array[index - Min]; }
        set { array[index - Min] = value; }
    }

    public int Min {get; private set;}
    public int Max {get; private set;}

    T[] array;

    public IEnumerator<T> GetEnumerator()
    {
        return array.GetEnumarator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return array.GetEnumarator();
    }

}

回答

只需将下界存储在const偏移整数中,然后从源返回的任何内容中减去该值作为索引。

另外:这是旧的VB6功能。我认为可能有一个属性可以支持它。