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());
War es hilfreich?

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top