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

本文关键字:数组 不匹配 新数组 动态 类型 目标 | 更新日期: 2023-09-27 18:31:23

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

这是我代码的一小段:

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

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

进行

分配时,运行时会引发异常:

数组类型不匹配异常尝试在数组中存储错误类型的元素时引发的异常。

我最初认为使用动态数据类型可以防止这种情况,但这是有道理的,运行时在输入第一个值时将动态数组形成 string[] 类型的数组。(拆分首先在术语索引上运行)

是否有任何方法可以防止这种行为并将"奇数"值存储在termIndex中,或者我需要使用其他变量/字典吗?

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

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

举个例子:

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

这将运行良好,array被实例化为"真正的"dynamic[]

对比一下:

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

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


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

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

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

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

但就目前而言,听起来更像是您希望使用列表而不是数组。

var termIndex = new List<dynamic>();

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