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

时间:2016-01-22 11:14:28

标签: c# arrays dynamic dynamic-arrays

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

以下是我的代码的一小部分:

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

虽然termIndex是动态数组,而tempDyn是动态数据类型。 在我为termIndex [i]分配tempDyn的Val之前,它已经拥有一个值。类型:字符串。 tempDyn的类型为object [],但是我没有对特定于某种类型的值运行任何操作。

当分配发生时,Runtime抛出异常:

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

我最初认为这可以通过使用dynamic-Datatypes来防止,但是有意义的是,当输入第一个值时,运行时将dynamic-Array形成为string []类型的数组。 (在termIndex上首先运行拆分)

是否有任何方法可以阻止此行为并在termIndex中存储“奇数”值,还是需要使用其他变量/词典?

2 个答案:

答案 0 :(得分:2)

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

一个例子:

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的使用。动态变量在性能方面稍贵一些,但这不是主要观点。主要问题是,通过使用动态而不需要它们,您可以放弃编译器通过静态输入变量为您提供的所有帮助。你也会失去像intellisense或autocompletion这样的好东西。

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

答案 1 :(得分:1)

我不确定你到底在想什么。

提供更多代码,比如变量的定义,有助于理解。

但是现在听起来更像是你想要使用列表代替数组。

var termIndex = new List<dynamic>();

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