这样会产生异常,报indexoutofrange异常

解决方案 »

  1.   

    一般情况,代表一个 IndexOutOfRangeException...
    但是如果这个是类似 (int[,])Array.CreateInstance(typeof(int), new[] { 5, 5 }, new[] { -1, -1 }); 这样创建的,那么负数下标就是合法的。或者说,CLI定义里是支持负下标数组的,但是c#本身的数组定义语法不支持。而且.net基础类库也不支持操作负下标数组,所以最好不要用。
      

  2.   

    ruby这样的语言支持,-1表示最大下标,等于绕回去了。
    C#没听说这种写法。
      

  3.   

    虽然没什么意义,我还是再说下,负数下标(其实是非0起始的下标)的数组是可以存在的。参考 ECMA-335 I.8.9.1 Array types 里面的描述,这样子的数组不符合CLS规范,而且框架类库也无需支持。这里负数没有什么特殊的意义,只是可以定义一个起始下标,和数组的大小,范围里包含的数就可以使用。可以测试:// arr 是 int[-1 .. 3, -1 .. 3] 的数组,类型为 int[,]
    var arr = (int[,])Array.CreateInstance(typeof(int), new[] { 5, 5 }, new[] { -1, -1 });
    arr[-1, -1] = 1; // ok
    arr[-1, 3] = 1;  // ok
    arr[-1, 4] = 1;  // exception
    arr[-2, 0] = 1;  // exception上面是二维的,一维数组因为clr生成的类型不同,无法使用c#数组的语法,但是可以通过Array上面的方法操作:// arr 是 int[-1 .. 3] 的数组,类型为 int[*]
    var arr = Array.CreateInstance(typeof(int), new[] { 5 }, new[] { -1 });
    arr.SetValue(1, -1); // ok
    arr.SetValue(1, 3);  // ok
    arr.SetValue(1, 4);  // exception
    arr.SetValue(1, -2); // exception
      

  4.   


    LBound = 0
    UBound >= 0
    -1 < LBound
    所以越界...
      

  5.   

    数组下标确实可以从非0开始。基本上,如果你使用COM跟Office系列交互,那么数组下标可能从1开始(而不是从0开始)。除此外以,很少遇到其它的表示形式。你应该贴出你所看到的那个东西的地址。也许它只是印错了呢。