VBScript默认属性有问题
我阅读了Eric Lippert关于VBScript中默认属性语义的文章: 它说: IDispatch::Invoke的实现者的规则是,如果以下所有条件均为真:VBScript默认属性有问题,vbscript,properties,Vbscript,Properties,我阅读了Eric Lippert关于VBScript中默认属性语义的文章: 它说: IDispatch::Invoke的实现者的规则是,如果以下所有条件均为真: 调用方调用一个属性 调用者传递一个参数列表 该属性实际上不接受参数列表 该属性返回一个对象 该对象具有默认属性 该默认属性接受一个参数列表 然后使用参数列表调用默认属性。奇怪但真实 从表面上看,这似乎是一条奇怪的规则,但在处理收藏时,这是非常宝贵的。或者至少是这样,但我似乎无法让它发挥作用 class Test1 publi
- 调用方调用一个属性
- 调用者传递一个参数列表
- 该属性实际上不接受参数列表
- 该属性返回一个对象
- 该对象具有默认属性
- 该默认属性接受一个参数列表
class Test1
public property get foo
set foo = new Test2
end property
end class
class Test2
public default property get bar (arg)
Response.Write arg
end property
end class
dim t: set t = new Test1
Response.Write TypeName(t.foo) ' => "Test2"
t.foo.bar("Hello, World!") ' => "Hello, World!"
t.foo("Hello, World!") => "Microsoft VBScript runtime error '800a01c2' / Wrong number of arguments or invalid property assignment: 'foo'"
调用方调用foo
属性并传递参数列表。foo
属性实际上不接受参数列表。foo
属性返回类型为Test2
的对象Test2
有一个默认属性,bar
。该默认属性接受一个参数列表
这是一个错误,还是我误解了默认属性语义或我的代码?您的问题在这一行: t、 福(“你好,世界!”) Test2类没有名为foo的方法。你的意思是: t、 foo.bar=“你好,世界!”
您的代码也不完整。除非您打算将属性设置为只读,否则还应指定setter。好吧。我本以为这会奏效。这可能是VBScript属性获取程序实现中的一个错误,这可能是我的错。很抱歉
由于上一次接触该代码的人是1998年的我,因此我不希望很快就能得到修复。我不确定您在这里说的是什么。这是一个最小的测试用例,不是实用的代码。这些属性的存在只是为了演示我得到的行为,而这与setter没有任何关系。