Domanda

Innanzitutto, due esempi:

// 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

Ora, la mia ipotesi sul perché il secondo non funziona è a causa della boxe. Lo scopo di questo codice è implementare IComparable . Ho bisogno di un modo per forzare un oggetto in un lungo o un ulong come appropriato, o se non lo è, piuttosto che lanciare un errore. Non voglio implementare controlli per ogni tipo numerico di base (byte, int, long, ubyte, ...) Preferirei semplicemente catturarli nel tipo numerico più grande e gestirli in quel modo. Pensieri di tutte le persone intelligenti qui? Come posso decomprimere l'oggetto, preferibilmente evitando la riflessione, ma suppongo che sia l'unico modo ... O non dovrei semplicemente implementare la versione non generica di IComparable ?

Modifica

Questo sembra funzionare, ma sembra un orribile trucco attorno al problema. Sono solo io?

long lFoo = long.Parse(foo.ToString());
È stato utile?

Soluzione

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

Altri suggerimenti

Quando esegui il casting su un tipo di valore, stai davvero forzando un'operazione IL di unbox, che richiede che il tipo a cui stai eseguendo il casting corrisponda a esattamente il valore in box; non ci sono conversioni, implicite o esplicite che possono avvenire contemporaneamente.

Questo di solito significa che devi fare uno switch usando il typecode (o un if / else se usi tipi), o, nel tuo caso, andare con un controllo per null seguito da Convert.ToInt64 (), che dovrebbe gestirlo correttamente.

Non sei solo tu, tuttavia tryparse non solleva un'eccezione.

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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top