首先,两个例子:

// 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,或者如果不是,则抛出错误。我不想为每个基本的数字类型(byte,int,long,ubyte,...)实现检查。我宁愿用最大的数字类型捕获它们并以这种方式处理它。这里所有聪明人的想法?我怎样才能取消对象的对象,最好避免反射,但我想如果这是唯一的方法......或者我应该不实现 IComparable 的非泛型版本?

修改

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

long lFoo = long.Parse(foo.ToString());
有帮助吗?

解决方案

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

其他提示

当您转换为值类型时,您实际上正在强制执行unbox 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
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top