现有数组值的目标类型与新数组值不匹配(动态)

Target type of existing array-value doesn't match the new one (dynamic)

我最近发现了动态数据类型,它对我目前从事的项目非常有用。

这是我的一小段代码:

                    if (tempDyn != null)
                    {
                        termIndex[i] = tempDyn;
                    }

虽然 termIndex 是动态数组,而 tempDyn 是动态数据类型。 在我将 tempDyn 的 Val 赋给 termIndex[i] 之前,它已经拥有了一个值。类型:字符串。 tempDyn 是 object[] 类型,但我不 运行 对可能特定于特定类型的值进行任何操作。

当分配发生时运行时抛出异常:

ArrayTypeMismatchException 尝试在数组中存储错误类型的元素时抛出的异常。

我最初认为这可以通过使用动态数据类型来防止,但这是有道理的,当输入第一个值时,运行time 将动态数组形成为字符串 [] 类型的数组。 (在 termIndex 上拆分 运行 首先)

有没有办法防止这种行为并将 "odd" 值存储在 termIndex 中,或者我是否需要进一步处理 variables/dictionaries?

你的数组是编译时类型 dynamic[] 并不能确保数组真的可以存储任何类型的值,这只是意味着编译器不会做任何类型检查,那些只会是在 运行 时间完成。

一个例子:

dynamic[] array = new dynamic[2];    
array[0] = "blah";
array[1] = 1;

这将运行就好了,array被实例化为一个"true" dynamic[]

对比一下:

dynamic[] array = new string[2];    
array[0] = "blah";
array[1] = 1; // <-- throws an ArrayTypeMismatchException!

在这种情况下,array 确实是 string[]。将其存储在 dynamic[] 变量中只会跳过编译时类型验证,但不会神奇地允许您将任何内容存储在数组中。


根据一般经验,您应该限制 dynamic 的使用。动态变量在性能方面要贵一些,但这不是重点。主要问题是,通过在你并不真正需要它们的地方使用动态,你放弃了编译器可以通过静态键入变量为你提供的所有帮助。您还会失去诸如智能感知或自动完成之类的好东西。

dynamic 在处理本质上是动态的源时是一个很好的功能,例如 json 输入,但不要过度使用它。

我不确定你到底在尝试什么。

提供更多代码(如变量定义)将有助于理解。

但现在听起来您更希望使用列表而不是数组。

var termIndex = new List<dynamic>();

https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx