我最近发现了动态数据类型,它对我目前正在处理的项目非常有用。
以下是我的代码的一小部分:
if (tempDyn != null)
{
termIndex[i] = tempDyn;
}
虽然termIndex是动态数组,而tempDyn是动态数据类型。 在我为termIndex [i]分配tempDyn的Val之前,它已经拥有一个值。类型:字符串。 tempDyn的类型为object [],但是我没有对特定于某种类型的值运行任何操作。
当分配发生时,Runtime抛出异常:
ArrayTypeMismatchException 尝试在数组中存储错误类型的元素时抛出的异常。
我最初认为这可以通过使用dynamic-Datatypes来防止,但是有意义的是,当输入第一个值时,运行时将dynamic-Array形成为string []类型的数组。 (在termIndex上首先运行拆分)
是否有任何方法可以阻止此行为并在termIndex中存储“奇数”值,还是需要使用其他变量/词典?
答案 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