我使用界面访问旧应用程序。从这个应用程序我有一些我无法访问的“双数组”。返回类型被声明为虚拟动态。每当我访问数组时,我都会遇到异常。
在this question上我发现可能是因为索引数组错误了。所以我尝试了所提出的解决方案,但正如我所说,我甚至无法访问数组而没有获得异常。
有关错误可能是什么的任何想法?
汉斯方法的代码:
var dataSetValues = dataSet.DoubleArray;
var result = ConvertDoubleArray(dataSetValues); // <<<<<< This is where I get an exception
public static double[] ConvertDoubleArray(Array arr)
{
if (arr.Rank != 1)
throw new ArgumentException();
var retval = new double[arr.GetLength(0)];
for (int ix = arr.GetLowerBound(0); ix <= arr.GetUpperBound(0); ++ix)
retval[ix - arr.GetLowerBound(0)] = (double) arr.GetValue(ix);
return retval;
}
DoubleArray的接口声明:
public virtual dynamic DoubleArray { get; set; }
例外:
System.InvalidCastException:无法转换类型的对象 'System.Double [*]'输入'System.Double []'。在 CallSite.Target(Closure,CallSite,VirtualEnvironmentManager, 对象)在 System.Dynamic.UpdateDelegates.UpdateAndExecute2 [T0,T1,TRET](调用点 site,T0 arg0,T1 arg1)at FormulaTestExecutor.Common.VirtualEnvironmentManager.CreateVirtualStructure(公式 公式) d:\开发\ TFS \ MAIN \工具\ FormulaMTest \ FormulaTestExecutor \ FormulaTestExecutor \ COMMON \ VirtualEnvironmentManager.cs:行 55
异常的Stacktrace:
FormulaTestExecutor.exe!FormulaTestExecutor.Common.VirtualEnvironmentManager.CreateVirtualStructure(FormulaTestExecutor.Model.Formula formula = {FormulaTestExecutor.Model.Formula})第55行C#符号已加载。 FormulaTestExecutor.exe!FormulaTestExecutor.Program.Main(string [] args = {string [0]})第18行C#符号已加载。
答案 0 :(得分:3)
你必须这样做:
var dataSetValues = dataSet.DoubleArray; // dataSetValues is dynamic
var result = ConvertDoubleArray((Array)(object)dataSetValues);
原因是&#39;动态&#39; DoubleArray的类型(可能是在添加COM引用时在界面中自动定义的)。它是super smart thing尝试自行完成从System.Double[*]
到System.Double[]
的转换,但它不够智能(它不能这样做)阅读StackOverflow答案......但是)
所以,你必须要求它只是传递对象&#39;,以便能够将它直接传递给CLR低级别转换,这可以做System.Double [*]到阵列没有崩溃。获得数组后,可以重新使用ConvertDoubleArray实用程序。
答案 1 :(得分:0)
实际上我找到了一个解决方案: Unable to cast object of type 'System.Single[*]' to type 'System.Single[]'
如果我想要转换安全数组,我首先需要将其转换为.NET对象,然后才能将其转换为数组。
var dataSetValues = (Array)(object)dataSetDoubleArray;