C# 装箱原语值的动态比较

C# 装箱原语值的动态比较,c#,object,primitive-types,boxing,icomparable,C#,Object,Primitive Types,Boxing,Icomparable,我需要比较两个基本类型(数值!)(都作为对象装箱),以找到更大的一个。 我不能使用泛型,因为我只得到对象,但我知道未固定的值是原始数(int、short、long、float等),所以我可以转换为IComparable 我怎样才能比较这些呢?CompareTo()抛出错误,因为它们是不同的类型,但ChangeType可能导致OverflowException public static int Compare(object value1, object value2) {

我需要比较两个基本类型(数值!)(都作为对象装箱),以找到更大的一个。 我不能使用泛型,因为我只得到对象,但我知道未固定的值是原始数(int、short、long、float等),所以我可以转换为IComparable

我怎样才能比较这些呢?CompareTo()抛出错误,因为它们是不同的类型,但ChangeType可能导致OverflowException

        public static int Compare(object value1, object value2)
    {
        //e.g. value1 = (object)(int)1; value2 = (object)(float)2.0f
        if (value1 is IComparable && value2 is IComparable)
        {
            return (value1 as IComparable).CompareTo(value2);
            //throws exception bc value1.GetType() != value2.GetType()
        }
        throw new ArgumentException();
    }
也许是这样

public static int Compare(object value1, object value2)
{
    if (value1 is double || value2 is double)
    {
        double d1 = Convert.ToDouble(value1);
        double d2 = Convert.ToDouble(value2);
        return d1.CompareTo(d2);
    }

    if (value1 is float || value2 is float)
    {
        float f1 = Convert.ToSingle(value1);
        float f2 = Convert.ToSingle(value2);
        return f1.CompareTo(f2);
    }

    long x1 = Convert.ToInt64(value1);
    long x2 = Convert.ToInt64(value2);
    return x1.CompareTo(x2);
}

字节、短整型可以转换为长整型,而不会丢失精度。

您所说的“大整型”是什么意思?我的意思是,考虑到它们都是数字,我想我们讨论的是数字比较,对吗?只是需要澄清是的,正确:)谢谢提醒,我已经将此信息添加到描述中,这可能是一个解决方案…但这些类型可能不同…因此需要大量手动检查是一个双精度还是浮点->转换为双精度-是一个int、short、byte、sbyte、uint、ushort、lung->转换为long-是一个ulong吗?->乌龙是一位小数吗?->。。。在某些情况下,“好吧,我认为你的解决方案仍然是最好的,正如这里所建议的:坦克你!