我阅读了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
。该默认属性采用参数列表。
这是一个错误,还是我误解了默认属性语义或我的代码?
答案 0 :(得分:11)
好吧。我原以为要工作。这可能是VBScript属性getter实现中的一个错误,这会导致我的错。对不起。
自从1998年接触该代码的最后一个人是我以来,我不希望很快就会有修复。
答案 1 :(得分:-1)
你的问题在这一行:
t.foo(“Hello,World!”)
您的Test2类没有名为foo的方法。你的意思是:
t.foo.bar =“你好,世界!”
您的代码也不完整。除非您打算将您的属性设置为只读,否则您也应该分配setter。