.Net数组下界> 0
尽管也许要做一件事情,但我需要在.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功能。我认为可能有一个属性可以支持它。