none
Erreur CType d'une valeur de type object en Structure personnalisée RRS feed

  • Question

  • Bonjour,

    J'ai créé une classe Structure personnalisée, proche d'un datetime.
    Cette classe implémente les mêmes interfaces que le type DateTime (récup dans Reflector)

    Public Structure MyDate
            Implements IComparable(Of DateTime), IEquatable(Of DateTime), IEquatable(Of String), IEquatable(Of Date?),  _
            IFormattable, IConvertible, System.Runtime.Serialization.ISerializable

    ....

    End Structure 

    Cette classe implémente aussi les opérateurs =,<>, CType.
    Tout fonctionne parfaitement, sauf le ctypage d'une valeur object en MyDate.

    Quand j'essaie d'exécuter l'instruction suivante, j'ai l'erreur ci-dessous.

    Dim str As String = "2009-10-25"
    Dim o As Object = str
    Dim myDt As myDate = CType(o, myDate)

    L'exception System.InvalidCastException n'a pas été gérée par le code utilisateur
      Message="Le cast spécifié n'est pas valide."
      Source="App_Web_mb_test5.aspx.c91a27e6.gdhdn04y"

    Alors que l'instruction ci-dessous fonctionne très bien.

    Dim str As String = "2009-10-25"
    Dim o As Object = str
    Dim t As DateTime = CType(str, DateTime)

    Et que l'instruction ci-dessous fonctionne aussi très bien :
    Dim str As String = "2009-10-25"
    Dim myDt As myDate = CType(str, myDate)

    C'est juste le passage par un object qui fait planter.

    J'ai pensé déclarer un operateur CType(object) => MyDate comme ceci.
    Public Shared Widening Operator CType(ByVal val As object) As MyDate
      Return New MyDate(val)
    End Operator

    Mais ça n'est pas autorisé.

    Quelqu'un a-t-il déjà rencontré ce problème ? Est-ce qu'il faut implémenter d'autres interfaces ? autres suggestions?

    Merci d'avance
    Mab

    jeudi 7 janvier 2010 08:47

Réponses

  • Bonjour,

    A partir de la documentation de msdn pour CType, on peut utiliser cette fonction pour convertir une expression en un type de données. On ne peut pas convertir le type object en type MyDate. C’est pour cette raison que la conversion du string en MyDate marche et la conversion d’object en MyDate vous donne des erreurs.

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Alex Petrescu mardi 12 janvier 2010 08:00
    lundi 11 janvier 2010 10:16
  • Effectivement, c'est la même chose avec DateTime. Ils ont créé des fonctions (Parse, ParseExact, TryParse et TryParseExact) pour résoudre se problème.
    Microsoft MVP C# :: mongeon.devrpm.ca
    • Marqué comme réponse Alex Petrescu mardi 12 janvier 2010 08:00
    lundi 11 janvier 2010 15:53
    Modérateur

Toutes les réponses

  • Bonjour,

    A partir de la documentation de msdn pour CType, on peut utiliser cette fonction pour convertir une expression en un type de données. On ne peut pas convertir le type object en type MyDate. C’est pour cette raison que la conversion du string en MyDate marche et la conversion d’object en MyDate vous donne des erreurs.

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Alex Petrescu mardi 12 janvier 2010 08:00
    lundi 11 janvier 2010 10:16
  • Effectivement, c'est la même chose avec DateTime. Ils ont créé des fonctions (Parse, ParseExact, TryParse et TryParseExact) pour résoudre se problème.
    Microsoft MVP C# :: mongeon.devrpm.ca
    • Marqué comme réponse Alex Petrescu mardi 12 janvier 2010 08:00
    lundi 11 janvier 2010 15:53
    Modérateur