Frage
Zuerst werden zwei Beispiele:
// 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
Nun, meine Vermutung, warum die zweite nicht funktioniert, ist wegen des Boxens. Der Zweck hinter diesem Code ist IComparable
zu implementieren. Ich brauche eine Möglichkeit, ein Objekt in entweder einem langen oder eine ulong gegebenenfalls zu zwingen, oder wenn es auch nicht, als ein Fehler zu werfen. Ich will nicht überprüft für jeden Grund numerischen Typ (Byte, int, long, ubyte, ...) haben, zu implementieren Ich würde lieber nur sie in der größten numerischen Typ fangen und mit ihm auf diese Weise behandeln. Gedanken von allen intelligenten Menschen hier? Wie kann ich unbox das Objekt, vorzugsweise Reflexion zu vermeiden, aber ich nehme an, wenn das der einzige Weg ist ... Oder soll ich die Nicht-Generika-Version von IComparable
einfach nicht umsetzen?
Edit:
Dies scheint zu funktionieren, aber es scheint wie eine schreckliche Hack, um das Problem. Ist es nur ich?
long lFoo = long.Parse(foo.ToString());
Lösung
object foo = (int) 43;
long lFoo = ((IConvertible) foo).ToInt64(null);
Andere Tipps
Wenn Sie auf einen Wert Typen sind Gießen Sie wirklich eine unbox IL Operation zwingen, das erfordert, dass der Typ, den Sie Streichhölzer sind Casting genau der Box-Wert; gibt es keine Wandlungen, implizit oder explizit, dass zur gleichen Zeit passieren kann.
Das bedeutet normalerweise, dass Sie entweder benötigen einen Schalter zu tun, um den Typcode (oder eine if / else if-Typen verwenden) oder in Ihrem Fall mit einem Scheck für null durch Convert.ToInt64 (), gefolgt gehen, der sollte abkommen mit ihm richtig.
Es ist nicht nur Sie, aber nicht TryParse nicht eine Ausnahme ausgelöst.
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
}