代码之家  ›  专栏  ›  技术社区  ›  Cheva

如何将System.Object[*]强制转换为System.Object[]

  •  7
  • Cheva  · 技术社区  · 14 年前

    当我试图归还 Array 用VFP9语言COM/DLL到我的.NET C#项目 System.Object[*] 阵法和我无法施展 System.Object[] (不带星号)。

    3 回复  |  直到 10 年前
        1
  •  9
  •   Thomas Levesque    14 年前

    蒂姆维的解决方案应该很管用。您可以使用Linq做一些更简单的事情:

    object[] newArray = sourceArray.Cast<object>().ToArray();
    

    以防你需要重新创建一个 System.Object[*] this overload Array.CreateInstance 方法:

    public static Array CreateInstance(
        Type elementType,
        int[] lengths,
        int[] lowerBounds
    )
    

    您可以按如下方式使用它:

    object[] normalArray = ...
    
    // create array with lower bound of 1
    Array arrayStartingAt1 =
        Array.CreateInstance(
            typeof(object),
            new[] { normalArray.Length },
            new[] { 1 });
    
    Array.Copy(normalArray, 0, arrayStartingAt1, 1, normalArray.Length);
    
        2
  •  6
  •   Timwi    14 年前

    不幸的是,你不能直接施放。但是,您可以创建一个类型为 object[] 把数据复制过来。有点像。。。

    Array sourceArray = ...;
    
    if (sourceArray.Rank != 1)
        throw new InvalidOperationException("Expected a single-rank array.");
    
    object[] newArray = new object[sourceArray.Length];
    Array.Copy(sourceArray, sourceArray.GetLowerBound(0),
               newArray, 0, sourceArray.Length);
    
        3
  •  4
  •   RoadBump    8 年前

    dynamic 对象,也从索引1开始 Array 对象,我收到了相同的错误信息。
    照其他答案所说的做是行不通的。因为一个奇怪的原因,即使是读 Length 属性引发了异常。
    我发现 this 回答,它成功了。
    显然,如果你使用C#4.0,你必须 object 首先,然后可以将其转换为 数组 . 在.NET的早期版本中,您可以直接强制转换。
    这是一个 Explanation