Option Strict on [Résolu]

Signaler
Messages postés
486
Date d'inscription
mardi 24 octobre 2000
Statut
Membre
Dernière intervention
23 mars 2019
-
Messages postés
486
Date d'inscription
mardi 24 octobre 2000
Statut
Membre
Dernière intervention
23 mars 2019
-
Bonjour,
J'ai un message d'erreur avec option Strict :
voici le message:
La résolution de surcharge a échoué, car aucun 'New' accessible ne peut être appelé avec ces arguments:
'PublicSub New(dw As Integer)' : Impossible de convertir une valeur de type 'System.Drawing.Point' en 'Integer'.
'PublicSub New(sz As System.Drawing.Size)': Option Strict On intedit les conversions implicites de 'System.Drawing.Point' en 'System.Drawing.Size'.

sur cette ligne : p = New Point(CType(converter.ConvertFrom(tt), Point))
voici mon code :
  For Each _DataRow As DataRowView In Me.DataT_VFBindingSource
                    _PictureBox = New PictureBox
                    _PictureBox.Tag = _DataRow(0)
                    Dim tt As String = CType(_DataRow(4), String) 'tt ={X=233,Y=90}
                    Dim p As Point
                    tt = tt.Replace(",", ";")
                    tt = tt.Replace("{X=", Nothing)
                    tt = tt.Replace("Y=", Nothing)
                    tt = tt.Replace("}", Nothing)

                    Dim converter As System.ComponentModel.TypeConverter
                    converter = System.ComponentModel.TypeDescriptor.GetConverter(GetType(Point))
                    p = New Point(CType(converter.ConvertFrom(tt), Point))
                    _PictureBox.Location = p


Merci

1 réponse

Messages postés
16052
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juin 2021
551
Bonjour

la réponse est clairement décrite dans le message d'erreur.

PictureBox.Location est du type Size et pas du type Point.

Et un Point ne peut pas être converti implicitement, c'est à dire mettre l'un dans l'autre sans se poser de question (si c'était complètement la même chose, pourquoi faire 2 types différents? Surtout dans le même nom de domaine).

Pour te donner un exemple, en .Net les entiers peuvent être décrits par 16, 32 ou 64 bits. 64 bits étant long à écrire, je vais te montrer avec 4, 8 et 16 bits:

En 16 bit 1 c'est 0000000000000001, si tu le forces en 8 c'est 00000001 et en 4 c'est 0001 dans ce cas si on fait une conversion ne pose aucun problème.
Par contre 0000001000100001 en bits devient 00100001 et en 4 bits 0001, cette fois la conversion entraine une perte d'information.

VB est très permissif c'est se qui le rend accessible aux amateurs (dans le bon sens du terme), mais aussi sont plus gros défaut, car une telle perte d'information aura des conséquences négatives sur le programme et sera difficile à deboguer pour le développeur qui n'a pas connaissance de ces subtilités.

Avec Option Strict, on interdit les conversions implicites destructrices (mettre du int16 dans un int64 ne posera jamais aucun problème). Ça t'incite à te poser la question, est ce que cette conversion est justifiée, me sera-t-elle utile ou problématique?

Dans ton cas la solution est simple, il suffit de créer une instance de Size.
Controle.Location = New Size(Longueur, Hauteur)

Messages postés
486
Date d'inscription
mardi 24 octobre 2000
Statut
Membre
Dernière intervention
23 mars 2019
4
ok merci pour les explications.
c'est bon cela marche.