VBScript中使用.Item setter嵌套字典遇800A01C2错误,如何解决?
VBScript中Scripting.Dictionary的Item属性赋值对象报错问题
注:此问题并非重复问题
需求限制
- 不希望创建新类
- 也不希望使用临时包装器(否则宁愿用
array(1)替代)
测试代码
sub Test() Dim D, V ' "as Variant" - not supported in VBS Set D = CreateObject("Scripting.Dictionary") D.Item("ffff") = 12345 DlgOk "set_item (int) ok" Set V = CreateObject("Scripting.Dictionary") D.Add "sdfsdfs", V DlgOk "add (dict) ok" D.Item("sdfsdfs") = V DlgOk "set_item ok" end sub
其中DlgOk为内部弹窗函数。
问题现象
根据WSH 5.6最新文档,上述代码应可正常运行,但实际测试发现:
- 为字典赋值简单值(如
D.Item("ffff") = 12345)可正常工作; - 使用
D.Add "sdfsdfs", V方法添加字典也可正常运行,但仅适用于外层字典为空的特定场景; - 但
D.Item("sdfsdfs") = V语句无论是否提前执行过Add操作,都会触发800A01C2“无效属性赋值”错误。无法直接用Add替代.Item赋值,因为Add在键已存在时会报错。
问题原因分析
查看ObjView中的COM声明,发现Item属性存在两个几乎相同的setter(propputref和propput),这似乎导致包括VBScript在内的多个语言运行时在赋值IDispatch/对象时出现异常,而普通值(如整数、数组)则无此问题。
求助
我能想到基于条件判断的变通方案,但想了解是否有更简便的方法,可直接让.Item赋值对象的操作生效?
内容的提问来源于stack exchange,提问作者Arioch 'The
相关产品推荐
相关产品推荐

