8
votes

Différence entre le casting en C # et vb.net

Le code suivant fonctionne bien en C #. xxx

mais ce code se bloque avec une exception overflowx in vb.net . xxx

Les deux extraits de code me semblent identiques. Quelle est la différence et comment puis-je obtenir le code C # converti en vb.net?


0 commentaires

7 Réponses :


2
votes

Avez-vous essayé d'utiliser DirectCast (B, INT16) ? Cype n'est pas la même chose qu'un casting C #.

ici 's un article comparant les performances de DirectCast et CTYPE , ainsi que dans les détails supplémentaires pour être utilisés.


1 commentaires

DirectCast (B, INT16) Cause Erreur de compilation La valeur de type 'INTEGER' ne peut pas être convertie en "court". msdn.microsoft.com/en-us/library/8sk75xak.aspx



8
votes

Tout d'abord: ma compréhension de ceci est que CTYPE (B, INT16) n'est pas identique à (int16) b. L'une est une conversion de type (CTYPE) et l'autre est une distribution. (Int16) B équivaut à DirectCast (B, INT16) plutôt que CTTYPE (B, INT16).

La différence entre les deux (comme indiqué sur MSDN) est que CTYPE réussit tant qu'il existe une conversion valide, toutefois, DirectCast nécessite le type de temps d'exécution de l'objet pour être identique, et comme tel, tout ce que vous 'Re faire consiste à dire au compilateur au moment de la conception que cet objet est de ce type plutôt que de lui dire de convertir en ce type.

Voir: http://msdn.microsoft. com / fr-nous / bibliothèque / 7K6Y2H6X (vs.71) .aspx

Le problème sous-jacent, c'est que vous essayez de convertir un entier 32 bits en un entier de 16 bits qui est ... [Je manque le mot dont j'ai besoin, peut-être que quelqu'un peut l'insérer ici pour moi]. La conversion de 16 bits à 32 bits est autorisée car elle est sans perte, la conversion de 32 bits à 16 bits est indéfinie. Pour pourquoi cela fonctionne dans C #, vous pouvez voir la réponse de @ Roman - elle concerne le fait que c # ne vérifie pas le débordement.

La valeur résultante de & h7ffffff et & hffff résultats in uint16.maxvalue (65535) UINT16 fonctionne de 0 à 65535, vous essayez de cramer cela dans INT16 qui fonctionne de -32768 à 32767, ce qui passe de -32768 à 32767. Comme vous pouvez le voir, ne va pas fonctionner. Le fait que cette valeur puisse s'intégrer à une UINT16 est coïncidente, ajoutant deux entiers 32 bits et essayer de les cramner dans un entier de 16 bits (courte) causerait souvent un débordement et je dirais ainsi que cela est une opération intrinsèquement dangereuse. < / p>


2 commentaires

En ce qui concerne pourquoi cela fonctionne dans C # et jette une exception dans VB, voir ma réponse ci-dessous.


Comme vous pouvez le constater, je masquage de la partie supérieure de l'INT32, j'ai donc toujours une valeur INT16 valide. Int32 et & h0000ffff = int16.



0
votes
?CType(b, Int16)
Constant expression not representable in type 'Short'.

?b
65535

?directcast(b, Int16)
Value of type 'Integer' cannot be converted to 'Short'.

?int16.TryParse(b.ToString(), c)
False

0 commentaires

11
votes

de MSDN :

Pour l'opération arithmétique, coulée ou de conversion pour lancer une exception overflowException, l'opération doit se produire dans un contexte vérifié. Par défaut, les opérations arithmétiques et les débordements à Visual Basic sont vérifiés; En C #, ils ne le sont pas. Si l'opération se produit dans un contexte non coché, le résultat est tronqué en éliminant les bits de haute commande qui ne correspondent pas au type de destination.

EDIT: Si vous allez au code du port de C # à vb.net, vous pouvez être intéressé par Différences entre eux . Également comparer et définir explicitement Paramètres du compilateur pour être identique aux paramètres par défaut dans C # (en cas de besoin).


6 commentaires

Si vous exécutez le code C #, cela ne provoque pas de débordement. Il convertit seulement 65535 (INT32) à -1 (int16)


Markj: C'est exactement ce qui est dit dans MSDN - en C # Les opérations arithmétiques ne sont pas cochées et le débordement ne se produit pas. Dans vb.net, ils sont vérifiés par défaut, nous obtenons ainsi une exception.


OK, alors que je vois le point que je crée par moi-même une sorte de mot-clé "non coché" équivalent pour vb.net. Je ne porte pas de code, je cherche juste une solution à cette question Stackoverflow.com/questions/1873402/...


Somos: Cette question a une bonne réponse acceptée. Je l'ai traduits à vb.net et posté comme nouvelle réponse. Cela fonctionne sans débordements. Voir Stackoverflow.com/questions/1873402/...


C'était la meilleure réponse disponible à ce moment-là, cette réponse m'a amené à créer cette question.


Pour ceux qui sont intéressés par la conversion de code de C # à vb.net et vice versa: visuelstudiomagazine.com/articles/2005/06/01/...



0
votes

Vous pouvez tronquer ce type de débordement avec une structure.

  Dim _i3216 As int3216
  _i3216.i32 = a And &HFFFF
  c = _i3216.i16low


0 commentaires

1
votes

http://www.cnblogs.com/liujq007/ Archives / 2010/120/12/04/1896059.html

Résumé: P>

à Type non signé: juste faire et opérateur, ou 2ère méthode. P>

Dim a As Short = CShort(34042 << 16 >> 16)


0 commentaires

0
votes

Je suis tombé sur cette question lorsque vous recherchez une solution pour convertir une courte et obtenir le résultat du trop-plein avec l'erreur de débordement. J'ai trouvé une solution ici:

http: //bytes.com/topic/visual-basic-net/answers/732622-problèmes-typecestant-vb-net

à mi-chemin de la page est-ce:

L'ancien, vb «bon» truc de «pas de côté» à Hexadecimal et retour encore fonctionne toujours! xxx

Il semble fonctionner assez slick!


0 commentaires