none
Impossible de convertir un byte en Nullable(of Integer) RRS feed

  • Question

  •  

    Dans ces cinq exemples de code quatre fonctionnent le 1,  le 3, le 4, le 5

    MAIS sur le 2 une exception se produit et la je dois avouer que je ne comprends pas

    1. Dim o As Byte = 0
      Debug.WriteLine(o.GetType.ToString)  ==>   affiche System.Byte
      Dim ii As Nullable(Of Integer) = CType(o, Nullable(Of Integer))
      Dim b As Nullable(Of Boolean) = CType(CType(o, Nullable(Of Integer)), Nullable(Of Boolean))
      ... Aucun problème
    2. Dim o1 As Object = CType(0, Byte)
      Debug.WriteLine(o1.GetType.ToString)  ==> affiche System.Byte
      Dim ii1 As Nullable(Of Integer) = CType(o1, Nullable(Of Integer))    ' sur cette ligne exception voir ci-desous
      ??????? pourquoi
      Dim b1 As Nullable(Of Boolean) = CType(CType(o1, Nullable(Of Integer)), Nullable(Of Boolean))
    3. Dim o2 As Object = 0
      Debug.WriteLine(o2.GetType.ToString) ==> affiche System.Int32
      Dim ii2 As Nullable(Of Integer) = CType(o2, Nullable(Of Integer))
      Dim b2 As Nullable(Of Boolean) = CType(CType(o2, Nullable(Of Integer)), Nullable(Of Boolean))
      ... Aucun problème

    4. Dim o3 As Object = Nothing
      Dim ii3 As Nullable(Of Integer) = CType(o3, Nullable(Of Integer))
      Dim b3 As Nullable(Of Boolean) = CType(CType(o3, Nullable(Of Integer)), Nullable(Of Boolean))
      ... Aucun problème

    5. Dim o1 As Object = CType(0, Byte)   ' fonctionne aussi si on fait dim o1 as Object = nothing au lieu de Ctype(0, byte)
      Debug.WriteLine(o1.GetType.ToString)
      Dim ii1 As Nullable(Of Integer) = New Nullable(Of Integer)(o1)
      Dim b1 As Nullable(Of Boolean) = CType(ii1, Nullable(Of Boolean))
      ... Aucun problème

     

    Détail exception

    L'exception System.InvalidCastException n'a pas été gérée
      HResult=-2147467262
      IsTransient=False
      Message="Le cast spécifié n'est pas valide."
      Source="VSCatalogue"
      StackTrace:
           à VSCatalogue.frmMain.frmMain_Load(Object sender, EventArgs e) dans C:\Working\myCDM\DEVL\CDM\VSCatalogue\frmMain.vb:ligne 117
           à System.EventHandler.Invoke(Object sender, EventArgs e)
           à System.Windows.Forms.Form.OnLoad(EventArgs e)
           à System.Windows.Forms.Form.OnCreateControl()
           à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
           à System.Windows.Forms.Control.CreateControl()
           à System.Windows.Forms.Control.WmShowWindow(Message& m)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
           à System.Windows.Forms.ContainerControl.WndProc(Message& m)
           à System.Windows.Forms.Form.WmShowWindow(Message& m)
           à System.Windows.Forms.Form.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
           à System.Windows.Forms.Control.SetVisibleCore(Boolean value)
           à System.Windows.Forms.Form.SetVisibleCore(Boolean value)
           à System.Windows.Forms.Control.set_Visible(Boolean value)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.Run(ApplicationContext context)
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
           à VSCatalogue.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
      InnerException:

    mercredi 23 février 2011 12:30

Réponses

  • Bonjour,

     

    Pour une réponse complète à cette question, je vous conseille de consulter la documentation MSDN sur Boxing et Unboxing.

     

    Voyons comment ça se passe.

    Si on déclare une variable de type valeur, « byte », la valeur de la variable est créée sur le « stack ». Quand on déclare une variable de type objet (référence), une zone de mémoire est réservée sur le « heap » pour garder l’objet. Assigner une variable de type valeur a une variable de type objet cause le « boxing ». Le boxing signifie que le contenu de la variable de type valeur est copié dans la zone de mémoire de l’objet, sur le « heap », et on travaille en fait avec une référence vers cette zone de mémoire, donc avec un objet et pas avec une valeur.

     

    L’instruction

    Dim varObjB as object = ctype(0, Byte)

    envoie la valeur 0 de type byte vers un objet. Pour assigner cette valeur a l’objet, elle est premièrement transformé en objet, le processus de « boxing » que je viens d’expliquer. Vous voyez donc qu’il n’est pas la même chose d’assigner 0 a un byte et a un objet.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    vendredi 25 février 2011 12:11

Toutes les réponses

  • Bonjour,

     

    Une conversion automatique de Byte à Nullable (Of Integer) n’est pas possible, donc l’erreur de conversion. Si vous voulez faire cette conversion, il faut le faire en deux étapes :

     

    Dim a As Nullable(Of Byte) = CType(o1, Nullable(Of Byte))

    Dim x1 As Nullable(Of Integer) = CType(a, Nullable(Of Integer))

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    jeudi 24 février 2011 11:03
  •  

    Je veux bien mais la j'ai du mal à comprendre le pourquoi.

    Notament en déclarant une variable Byte ca marche

    Quelle est donc la différence interne entre :

       dim varB  as byte = 0

       dim varObjB  as object = ctype(0, Byte)

    Merci

     

     

     

    jeudi 24 février 2011 11:17
  • Bonjour,

    c'est le typage qui est different

    il faut des fois fortement typé son type de variable pour avoir un fonctionnement correcte


    Cordialement,
    Xavier
    Alias Troxsa My M@iL
    vendredi 25 février 2011 10:00
    Auteur de réponse
  • Bonjour,

     

    Pour une réponse complète à cette question, je vous conseille de consulter la documentation MSDN sur Boxing et Unboxing.

     

    Voyons comment ça se passe.

    Si on déclare une variable de type valeur, « byte », la valeur de la variable est créée sur le « stack ». Quand on déclare une variable de type objet (référence), une zone de mémoire est réservée sur le « heap » pour garder l’objet. Assigner une variable de type valeur a une variable de type objet cause le « boxing ». Le boxing signifie que le contenu de la variable de type valeur est copié dans la zone de mémoire de l’objet, sur le « heap », et on travaille en fait avec une référence vers cette zone de mémoire, donc avec un objet et pas avec une valeur.

     

    L’instruction

    Dim varObjB as object = ctype(0, Byte)

    envoie la valeur 0 de type byte vers un objet. Pour assigner cette valeur a l’objet, elle est premièrement transformé en objet, le processus de « boxing » que je viens d’expliquer. Vous voyez donc qu’il n’est pas la même chose d’assigner 0 a un byte et a un objet.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    vendredi 25 février 2011 12:11
  • Merci, je comprends mieux.

    Si bien compris :

     

       Dim o as object = ctype(0, byte)  è      boxed byte =  reférence : object + copy type valeur

     

       Dim b as object = ctype(o, Nullable(of integer)) 

           è   unboxing de o vers integer interdit car copy du type valeur originale n’est pas un entier (suppose copie mémoire) d’où invalide cast exception, pour pouvoir faire conversion en object Nullable(of integer)

    frj74350

     

     

      

    lundi 28 février 2011 14:32
  • Bonjour,

     

    Je ne sais pas si l’exception vient du fait qu’on doit faire la conversion de byte vers int, car le type byte peut être contenu dans int. On voit, quand-même, qu’il s’agit de plusieurs conversions (explicites et implicites) : unboxing objet o + conversion byte vers nullable(of integer). Apparemment, l’implémentation de ces types ne permet pas une telle conversion, donc il faut faire chaque conversion a son tour, dans des instructions séparées.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     


    Suivez MSDN sur Twitter 

    mardi 1 mars 2011 10:27