首先,举两个例子:
// 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
现在,我猜测为什么第二个不起作用是因为拳击。此代码背后的目的是实现IComparable
. 我需要一些方法来将一个对象强制转换为 long 或 ulong ,或者如果两者都不是,而不是抛出错误。我不想对每种基本数字类型(字节、整数、长整数、ubyte 等)实施检查,我宁愿只以最大的数字类型捕获它们并以这种方式处理。这里所有聪明人的想法?我怎样才能拆箱对象,最好避免反射,但我想如果这是唯一的方法......或者我应该不实现的非泛型版本IComparable
?
编辑:
这似乎可行,但似乎是解决问题的可怕技巧。只有我吗?
long lFoo = long.Parse(foo.ToString());