现有数组值的目标类型与新数组值不匹配(动态)
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
我最近发现了动态数据类型,它对我目前从事的项目非常有用。
这是我的一小段代码:
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