Tout d'abord, deux exemples:question de boxe
// 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 pense que la raison pour laquelle la seconde ne fonctionne pas est à cause de la boxe. Le but de ce code est de mettre en œuvre IComparable
. J'ai besoin d'un moyen de contraindre un objet en un long ou un ulong selon le cas, ou si ce n'est ni l'un ni l'autre, que de lancer une erreur. Je ne veux pas avoir à implémenter des contrôles pour chaque type numérique de base (byte, int, long, ubyte, ...) Je préfère les attraper avec le plus grand type numérique et le traiter de cette façon. Pensées de tous les gens intelligents ici? Comment puis-je déballer l'objet, évitant de préférence la réflexion, mais je suppose que si c'est le seul moyen ... Ou devrais-je simplement ne pas implémenter la version non générique de IComparable
?
Edit:
Cela semble fonctionner, mais semble horrible bidouille autour du problème. Est ce juste moi?
long lFoo = long.Parse(foo.ToString());
Je serais intéressé de voir exactement pourquoi vous avez besoin de le faire. Comment cela se rapporte-t-il à IComparable? –