avril
2007
En C#, quand on veut indexer une classe, il suffit de rajouter la propriété suivante :
public object this[object key]
En VB, il faut utiliser le mot clé Default :
Default Public ReadOnly Property Item(ByVal key As Object) As Object
Dans le cas d’une classe générique implémentant une interface non générique, on peut souhaiter que la propriété d’indexation soit plus fortement typée dans la classe que dans l’interface :
{
public T this[T key]
{
get { [...] }
}
object ITest.this[object key]
{
get { return this[(T)key]; }
}
}
interface ITest
{
object this[object key]{get;}
}
Déjà, première remarque, Reflector ne sait pas traduire ce code. En effet, Reflector ne sait pas traduire l’implémentation d’une interface en VB ! Il ne rajoute en effet pas le « Implements ITest.Item ».
Mais si j’écris ce post ce n’est pas pour parler de Reflector mais pour parler d’une limitation de VB. En VB, la logique voudrait que mon code se traduise par :
Implements ITest
Private ReadOnly Property InterfaceItem(ByVal key As Object) As Object Implements ITest.Item
Get
Return Me(DirectCast(key, T))
End Get
End Property
Default Public ReadOnly Property Item(ByVal key As T) As T
Get
[...]
End Get
End Property
End Class
Interface ITest
Default ReadOnly Property Item(ByVal key As Object) As Object
End Interface
Cependant, le compilo gueule car le mot clé Default, présent dans l’interface n’est pas réutilisé dans l’implémentation de cette interface. Et comme je ne peux pas (heureusement d’ailleurs) avoir deux propriétés avec les même paramètres (en VB, les propriétés peuvent avoir des paramètres) marquées default, je suis dans une impasse ! La propriété indexable ne peut pas être différente de celle de l’interface en VB :(. Du moins, je ne sais pas comment la rendre différente. Si quelqu’un a la réponse, n’hésitez pas à poster un commentaire.