C#拳击问题

Mat*_*ley 2 c# unboxing icomparable

首先,两个例子:

// 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
Run Code Online (Sandbox Code Playgroud)

现在,我猜测为什么第二个不起作用是因为拳击.此代码背后的目的是实现IComparable.我需要一些方法来强制将对象强制转换为long或ulong,或者如果不是,则抛出错误.我不想为每个基本的数字类型(byte,int,long,ubyte,...)实现检查.我宁愿用最大的数字类型捕获它们并以这种方式处理它.这里所有聪明人的想法?我怎样才能取消打开对象,最好避免反射,但我想如果这是唯一的方法......或者我应该不实现非泛型版本IComparable

编辑:

这似乎有效,但似乎是一个可怕的黑客围绕这个问题.只有我吗?

long lFoo = long.Parse(foo.ToString());
Run Code Online (Sandbox Code Playgroud)

Mar*_*ade 7

object foo  = (int) 43;
long   lFoo = ((IConvertible) foo).ToInt64(null);
Run Code Online (Sandbox Code Playgroud)