Pergunta

Primeiro, dois exemplos:

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

Agora, meu palpite por que o segundo não funciona é por causa do boxe. O objetivo por trás deste código é implementar IComparable. Preciso de alguma maneira de coagir um objeto em um longo ou um ulong, conforme apropriado, ou se não for, do que lançar um erro. Não quero ter que implementar verificações para cada tipo numérico básico (byte, int, long, ubyte, ...) prefiro pegá -los no maior tipo numérico e lidar com isso dessa maneira. Pensamentos de todas as pessoas inteligentes aqui? Como posso desbotar o objeto, de preferência evitando reflexão, mas suponho que se essa é a única maneira ... ou eu não deveria implementar a versão não generica de IComparable?

Editar:

Isso parece funcionar, mas parece um truque horrível em torno do problema. Sou apenas eu?

long lFoo = long.Parse(foo.ToString());
Foi útil?

Solução

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

Outras dicas

Quando você está lançando para um tipo de valor, você está realmente forçando uma operação da Unbox IL, que exige que o tipo que você está lançando para corresponder exatamente o valor da caixa; Não há conversões, implícitas ou explícitas que possam acontecer ao mesmo tempo.

Isso geralmente significa que você precisa fazer um switch usando o TypeCode (ou um if/else se estiver usando tipos) ou, no seu caso, vá com uma verificação para nulo seguida por convert.toint64 (), que deve lidar com isso corretamente.

Não é apenas você, no entanto, o Tryparse não levanta uma exceção.

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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top