Question

Premièrement, deux exemples:

// This works
int foo = 43;
long lFoo = foo;

// This doesn't
object foo = (int)43;
long? nullFoo = foo as long?; // returns null
long lFoo = (long)foo; // throws InvalidCastException
if (foo.GetType() == typeof(int))
    Console.WriteLine("But foo is an int..."); // This gets written out

Maintenant, je suppose que la seconde ne fonctionne pas à cause de la boxe. L'objectif de ce code est d'implémenter IComparable . J'ai besoin d'un moyen de contraindre un objet dans une longue ou une longue comme approprié, ou si ce n'est ni l'un ni l'autre, que de jeter une erreur. Je ne veux pas avoir à mettre en œuvre des contrôles pour chaque type numérique de base (octet, entier, long, octet, ...). Je préfère simplement les attraper dans le type numérique le plus grand et les traiter de cette façon. Les pensées de toutes les personnes intelligentes ici? Comment puis-je déballer l'objet, en évitant de préférence les réflexions, mais je suppose que si c'est le seul moyen ... Ou devrais-je tout simplement pas implémenter la version non générique de IComparable ?

Modifier:

Cela semble fonctionner, mais semble être un horrible piratage autour du problème. Est-ce juste moi?

long lFoo = long.Parse(foo.ToString());
Était-ce utile?

La solution

object foo  = (int) 43;
long   lFoo = ((IConvertible) foo).ToInt64(null);

Autres conseils

Lorsque vous transposez un type de valeur, vous forcez réellement une opération IL unbox, ce qui nécessite que le type que vous spécifiez corresponde à exactement la valeur encadrée; il n’existe pas de conversions, implicites ou explicites, simultanées.

Cela signifie généralement que vous devez soit basculer à l'aide du code de type (ou un if / else si vous utilisez des types), ou, dans votre cas, cocher la case null suivie de Convert.ToInt64 (), qui devrait Traitez-le correctement.

Ce n'est pas que vous, mais tryparse ne déclenche pas d'exception.

object foo = (int)43;
long outVal;
if(long.TryParse(foo.ToString(),out outVal))
{
//take action with correct value of long
}
else
{
//maybe passed you another type of object
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top