我需要通用比较两个原始(数字!)类型(两者都装箱作为对象)来找到更大的一个。 我不能使用泛型,因为我只获取对象,但我知道未装箱的值是原始数字(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();
}
答案 0 :(得分:1)
也许是这样
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);
}
byte,short,int类型可以转换为long而不会导致精度损失。