leí el artículo de Eric Lippert en la semántica de propiedad por defecto en VBScript: http://blogs.msdn.com/b/ericlippert/archive/2005/08/30/458051.aspxProblemas con propiedades predeterminadas VBScript
Dice:
La regla para los ejecutores de IDispatch :: Invoke es si todos los siguientes son verdadera:
- la persona que llama invoca una propiedad
- la persona que llama pasa a una lista de argumentos
- la propiedad en realidad no tomar una lista de argumentos
- que la propiedad devuelve un objeto
- que objeto tiene una propiedad predeterminada
- que la propiedad por defecto tiene una lista de argumentos
luego llamar a la propiedad predeterminada con la lista de argumentos Extraño pero cierto.
Esto parece en su cara ser una regla extraña, pero es invaluable cuando se trabaja con colecciones. O al menos, lo sería, pero parece que no puedo hacer que funcione.
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'"
La persona que llama invoca la propiedad foo
y pasa una lista de argumentos. La propiedad foo
en realidad no tiene una lista de argumentos. La propiedad foo
devuelve un objeto del tipo Test2
. Test2
tiene una propiedad predeterminada, bar
. Esa propiedad predeterminada toma una lista de argumentos.
¿Esto es un error, o estoy malinterpretando la semántica de propiedad predeterminada o mi código?
No estoy seguro de lo que dices aquí. Este es un caso de prueba mínimo, no es un código práctico. Estas propiedades existen solo para demostrar el comportamiento que obtengo, que no tiene nada que ver con los setters. –