【发布时间】:2011-04-19 21:12:16
【问题描述】:
我阅读了 Eric Lippert 关于 VBScript 中默认属性语义的文章:http://blogs.msdn.com/b/ericlippert/archive/2005/08/30/458051.aspx
上面写着:
IDispatch::Invoke 实现者的规则是,如果以下所有条件都为真:
- 调用者调用一个属性
- 调用者传递一个参数列表
- 该属性实际上没有参数列表
- 该属性返回一个对象
- 该对象具有默认属性
- 默认属性采用参数列表
然后使用参数列表调用默认属性。奇怪但真实。
从表面上看,这似乎是一条奇怪的规则,但当您使用集合时,它却是无价之宝。或者至少,它会是,但我似乎无法让它工作。
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。该默认属性采用参数列表。
这是一个错误,还是我误解了默认属性语义或我的代码?
【问题讨论】:
标签: vbscript properties