object o = 123456U; ulong l = (ulong) o; // fails object o = 123456U; ulong l = (ulong) (uint) o; // succeeds void foo(object o) { switch (Type.GetTypeCode(o.GetType())) { case TypeCode.UInt32: case TypeCode.UInt64: ulong l = (ulong) o; RunUnsignedIntVersion(l); break; case TypeCode.Int32: case TypeCode.Int64: long n = (long) o; RunSignedVersion(n); break; } } foo(123456U); foo(123456); case TypeCode.Int32: RunSignedVersion((int) o); break; case TypeCode.Int64: long n = (long) o; RunSignedVersion(n); break; void foo(object o) { switch (Type.GetTypeCode(o.GetType())) { case TypeCode.UInt32: case TypeCode.UInt64: ulong l = Convert.ToUInt64(o); RunUnsignedIntVersion(l); break; case TypeCode.Int32: case TypeCode.Int64: long n = Convert.ToInt64(o); RunSignedVersion(n); break; } } [CLSCompliant(false)] public static ulong ToUInt64(object value) { return value == null? 0: ((IConvertible)value).ToUInt64(null); } [CLSCompliant(false)] public static long ToInt64(object value) { return value == null? 0: ((IConvertible)value).ToInt64(null); } case TypeCode.Int32: RunSignedVersion((int) o); break; case TypeCode.Int64: long n = (long) o; RunSignedVersion(n); break; public static class ConversionExtensions { public static ulong ToUInt64(this object value) { return ((IConvertible)value).ToUInt64(); } } object o = 123456U; ulong l = o.ToUInt64();