2011-04-19 33 views
9

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?

Respuesta

11

Bien golly. Hubiera esperado que eso funcionara. Probablemente sea un error en la implementación de los captadores de propiedades de VBScript, lo cual sería mi culpa. Lo siento por eso.

Dado que la última persona en tocar ese código fue yo en 1998, no esperaba una solución próxima en el corto plazo.

-1

Su problema es en esta línea:

t.foo

Su clase Prueba2 no tiene un método denominado foo ("Hola, mundo!"). Lo que quieres decir es esto:

t.foo.bar = "¡Hola, mundo!"

Su código también está incompleto. A menos que tenga la intención de que sus propiedades sean de solo lectura, también debe asignar setters.

+0

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. –

Cuestiones relacionadas