一,两个例子:C#拳击问题
// 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
。我需要某种方式将对象强制为长或长,或者如果不是,则抛出错误。我不想为每个基本的数字类型(byte,int,long,ubyte,...)实现检查。我宁愿用最大的数字类型来捕获它们并以这种方式处理它。来自这里所有聪明人的想法?我怎样才能解开对象,最好避免反射,但我想如果这是唯一的方法......或者我应该只是不实施非泛型版本IComparable
?
编辑:
这似乎是工作,但似乎是解决该问题一个可怕的黑客。只有我吗?
long lFoo = long.Parse(foo.ToString());
我很想看看究竟为什么你需要做到这一点。这与IComparable有什么关系? – 2008-10-07 11:52:34