Pregunta

Primero, dos ejemplos:

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

Ahora, mi conjetura de por qué el segundo no funciona es por el boxeo. El propósito de este código es implementar IComparable . Necesito alguna forma de obligar a un objeto a una larga o larga, según corresponda, o si no lo es, a que arroje un error. No quiero tener que implementar controles para cada tipo numérico básico (byte, int, long, ubyte, ...) Prefiero capturarlos en el tipo numérico más grande y tratarlos de esa manera. ¿Pensamientos de todas las personas inteligentes aquí? ¿Cómo puedo desempaquetar el objeto, preferiblemente evitando la reflexión, pero supongo que si es la única manera ... o no debería implementar la versión no genérica de IComparable ?

Editar:

Esto parece funcionar, pero parece un truco horrible para solucionar el problema. ¿Soy yo?

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

Solución

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

Otros consejos

Cuando está convirtiendo a un tipo de valor, realmente está forzando una operación IL de unbox, lo que requiere que el tipo que está emitiendo coincida con exactamente el valor encuadrado; no hay conversiones, implícitas o explícitas que puedan suceder al mismo tiempo.

Esto generalmente significa que necesita hacer un cambio usando el código de tipo (o un if / else si usa tipos) o, en su caso, ir con un cheque para nulo seguido de Convert.ToInt64 (), que debería lidiar con esto correctamente.

No eres solo tú, sin embargo, el tryparse no genera una excepción.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top