Comment jeter de l'Objet en Entier en VB.NET?
Comment dois-je coulés à partir d'un Object
à un Integer
dans VB.NET?
Quand je fais:
Dim intMyInteger as Integer = TryCast(MyObject, Integer)
il dit:
TryCast opérande doit être de type référence, mais Entier est un type valeur.
Pourquoi pas ça: CInt(Monobjet)
Lire mes commentaires sur l'Abaque de réponse.
j'espère qu'il finira par être Numérique soutien .Net. E. g. ont tous la valeur numérique à la prise en charge des types une
De peur qu'on pense que je suis ce qui suggère que les opérateurs de conversion être évité, je parle de les appliquer à
Lire mes commentaires sur l'Abaque de réponse.
Cint
(ou tout autre conversion appel) a un rôle différent de celui de TryCast
/DirectCast
. Il est judicieux si vous recevez un numérique type de valeur, par exemple, Simple ou Double, et souhaitez tronquer un nombre Entier. En l'appliquant à l'arrivée d'un Object
signifie que vous n'avez aucune idée de ce qui est à venir, et ce travail de conversion sera tentée. À mon humble avis, c'est un pari risqué style de programmation. Faire ce que Jonathan montre, de l'étendre si nécessaire. E. g., si vous voulez pour Analyser une Chaîne de caractères, puis vérifier si il est de type String, puis d'appeler TryParse. Être explicite.j'espère qu'il finira par être Numérique soutien .Net. E. g. ont tous la valeur numérique à la prise en charge des types une
INumeric
(ou autre) de l'interface. Étant donné que, au lieu de l'arrivée d'un MyObject As Object
on pourrait avoir l'arrivée d'un MyNumber As INumeric
. OK, maintenant nous savons "assez" à propos de ce qui est à venir, pour ne CInt(MyNumber)
, et être sûr que nous savons ce travail sera fait.De peur qu'on pense que je suis ce qui suggère que les opérateurs de conversion être évité, je parle de les appliquer à
Object
. Je considère qu'une "odeur de code". Je recommande pas l'utilisation d'opérateurs de conversion jusqu'à ce que vous avez identifié une interface ou une classe de base afin que vous puissiez avoir une certaine idée de ce que vous demandez d'être fait, et ce qui pourrait aller mal. Savoir si vous vous demandez quels sont le traitement de chaîne, ou une troncature numérique, ou simplement "unboxing".OriginalL'auteur CJ7 | 2012-10-31
Vous devez vous connecter pour publier un commentaire.
TryCast
est l'équivalent de C#'sas
de l'opérateur. C'est un "casting" de l'opérateur qui n'a pas lever une exception si la conversion échoue. Au lieu de cela, il retourneNothing
(null
en C#). Le problème est, vous ne pouvez pas affecter deNothing
(null
) (un type de référence) à unInteger
(valeur type). Il n'y a pas une telle chose comme unInteger
null
/Nothing
.Au lieu de cela, vous pouvez utiliser
TypeOf
etIs
:Ce tests pour voir si le runtime type de
MyObject
estInteger
. Voir la La documentation MSDN sur leTypeOf
de l'opérateur pour plus de détails.Vous pouvez aussi l'écrire comme ceci:
En outre, si un nombre entier avec une valeur par défaut (0) n'est pas approprié, vous pourriez envisager une
Nullable(Of Integer)
type.MyObject
êtreInteger
quand nous savons déjà qu'il estObject
?Nous n'avons pas le saviez déjà. Nous savons seulement que
MyObject
est unObject
référence. Il pourrait toujours pointer vers un objet de type quelconque. LeIf TypeOf x Is type
expression les tests de l'exécution type de l'objet.Ne devriez pas cette déclaration de la vôtre être
iif
plutôt queif
:If(TypeOf myObj Is Integer, DirectCast(myObj,Integer), 0)
?Minuscules, elles ne signifient rien.
Iif
c'est une fonction, qui a été remplacé par leIf
opérateur en VB 2008. Un rapide coup d'oeil à la MSDN docs va un long chemin. (Je vais répondre à vos questions et ne sait même pas de Visual Basic.)Sauf à partir d'un
String
"1" pour un entier 1 est pas un casting. C'est un conversion (la chaîne est analysée). L'OP est précisément de demander à propos de casting unObject
de référence qu'il est en supposant que est un nombre entier en une valeur entière. Je te remercie de ces points de rep retour, je vous remercie.OriginalL'auteur Jonathon Reinhart
Utilisation Directcast et attraper InvalidCastException
OriginalL'auteur Swordblaster
Vous pouvez utiliser ceci:
Chaîne hérite de l'Objet, et cette réponse est valable. C'est une autre réponse à l'OP de la question qui a été répondu correctement à 2 an. Cette option a un avantage, si l'objet contient une valeur entière dans la Chaîne de format, le succès de la réponse ne serait pas de travail, mais cette réponse. D'autre part, ma réponse sera besoin boxing et unboxing, de sorte que c'est le revers de la médaille.
OriginalL'auteur CoOl
L'équivalent pour TryCast est CType. Tous les deux vont faire une conversion de type, si c'est possible. En revanche, DirectCast convertir le type si il est ce type déjà.
Pour illustrer, vous pouvez utiliser CType pour convertir une Chaîne de caractères, ou Court, ou Double, pour un Entier. DirectCast seront généralement vous donner une syntaxe/erreur de compilation si vous faites cela; mais si vous essayez d'aller autour de l'erreur en utilisant le type de l'Objet (ce qui est appelé "boxe" et "unboxing"), il va lever une exception au moment de l'exécution.
Ce sera de sortie:
Donc à plus de suivre de près la TryCast de la sémantique, je vous suggère d'utiliser une fonction comme ceci:
Et pour illustrer son effet:
De course TestTryCastInteger() de sortie:
Il y a aussi est une telle chose comme un/Nothing Entier, ou tout autre type statique, appelé "nullable" de type, voir La déclaration de la Variable de point d'interrogation pour plus d'information. Mais qui n'a pas vraiment faire une "référence" de type.
TryCast
ne pas essayer la gamme complète des conversionsCType
tentatives. Les deux sont utilisés de manière assez différente.TryCast
est un très strict (et rapide) de conversion: il tente de "sortie" pour une sous-classe spécifique. Il est utilisé lorsqu'il est nécessaire de passer une instance de façon plus générale de la classe de base.CType
pouvez faire beaucoup plus de conversions -- ce qui est bon ou mauvais .... en fonction de l'intention du programmeur. Il peut tenter BEAUCOUP plus cher conversions, telles que l'analyse d'une chaîne. Son comportement peut également être surchargée dans les classes personnalisées, rien à faire. Mais même au-delà, la question en recommandant ici, c'est que vous n'avez pas assez d'information sur ce que l'OP a à l'esprit. C'est un pari risqué de la recommandation, qui pourrait conduire à des bogues. Il ne devrait pas être utilisé pour le cast de "l'Objet", à moins qu'un programmeur n'a tout simplement pas de soins de ce qui est à venir, et quel sera le résultat -- ils "veulent travailler". La vieille, peu fiable, le mode de programmation de Base.
En résumé, Jonathan est correct, si le but est d'écrire un programme fiable. Si l'on n'a aucun contrôle sur les entrants de type, et il est coincé avec une
Object
déclaration, et vous vous attendez à unvalue
type, alors la meilleure façon de procéder est de commencer à tester le type de l'objet. Décider quoi faire, une fois que vous savez quel type d'objet que vous avez.OriginalL'auteur Abacus