C# 拳击问题

C# 拳击问题,c#,icomparable,unboxing,C#,Icomparable,Unboxing,首先,有两个例子: // 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(

首先,有两个例子:

// 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
现在,我猜为什么第二个不起作用是因为拳击。此代码的目的是实现
i可比较
。我需要一些方法来强制一个对象成为long或ulong(如果两者都不是),而不是抛出一个错误。我不想对每种基本的数字类型(byte、int、long、ubyte等)都进行检查,我只想用最大的数字类型捕获它们,并以这种方式进行处理。这里所有聪明人的想法?如何取消对象的X轴,最好避免反射,但我想如果这是唯一的方法。。。或者我应该不实现非泛型版本的
IComparable

编辑:

这似乎可行,但似乎是一个可怕的黑客围绕问题。只是我吗

long lFoo = long.Parse(foo.ToString());

当您强制转换为值类型时,实际上是在强制执行取消装箱IL操作,这要求您强制转换的类型与装箱值完全匹配;不存在可以同时进行的隐式或显式转换


这通常意味着您需要使用类型代码进行切换(如果使用类型,则需要使用if/else),或者在您的情况下,检查null,然后检查Convert.ToInt64(),这将正确处理它。

这不仅仅是您自己的问题,但是tryparse不会引发异常

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
}

这不是我们要走的路。除了效率要低得多之外,我认为不能保证由ToString()生成的字符串格式实际上可以由Parse/TryParse()立即解析(也就是说,并非在所有情况下它都会往返),这实际上是有效的。。。为继承接口的基类型欢呼。从未完全理解过这一部分,但仍然有用。它实际上并不需要精确匹配。您可以取消装箱枚举作为其基础类型的装箱,反之亦然(尽管类型信息确实存在)。您还可以取消装箱到适当的可空类型。CLR允许一些类似的奇数转换,比如int[]到uint[],我想知道为什么需要这样做。这与IComparable有什么关系?
object foo  = (int) 43;
long   lFoo = ((IConvertible) foo).ToInt64(null);