2

首先,举两个例子:

// 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());
4

3 回答 3

7
object foo  = (int) 43;
long   lFoo = ((IConvertible) foo).ToInt64(null);
于 2008-10-07T03:08:19.553 回答
4

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

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

于 2008-10-07T02:45:38.570 回答
0

它不只是你,但是 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
}
于 2008-10-07T02:56:37.330 回答