在不同的.NET类型(例如int与double)上使用CompareTo()

在不同的.NET类型(例如int与double)上使用CompareTo(),.net,types,double,int,compareto,.net,Types,Double,Int,Compareto,我有一个静态方法,它接受两个对象类型变量并运行CompareTo方法: public static int Compare(Object objA, Object objB) { return (((IComparable)objA).CompareTo(objB)); } 问题是CompareTo在尝试比较不同类型(例如int和double)时抛出异常。 有谁知道C语言中比较两种不同类型的语言更好的方法吗? 还是解决这个问题的方法 谢谢在C中没有通用的方法来解决这个问题,因为没有通用的

我有一个静态方法,它接受两个对象类型变量并运行CompareTo方法:

public static int Compare(Object objA, Object objB)
{
   return (((IComparable)objA).CompareTo(objB));
}
问题是CompareTo在尝试比较不同类型(例如int和double)时抛出异常。 有谁知道C语言中比较两种不同类型的语言更好的方法吗? 还是解决这个问题的方法


谢谢

在C中没有通用的方法来解决这个问题,因为没有通用的解决方案。若并没有信息丢失,C编译器将隐式地将一种类型转换为另一种类型,然后比较它们。在任何其他情况下,这将引发异常


在本例中,实现接口的程序员负责决定两个对象是否具有可比性,而作为类的用户,您对这一点没有影响。

在C中没有解决该问题的通用方法,因为没有通用的解决方案。若并没有信息丢失,C编译器将隐式地将一种类型转换为另一种类型,然后比较它们。在任何其他情况下,这将引发异常


在本例中,实现接口的程序员负责决定两个对象是否具有可比性,而您作为类的用户对此没有影响。

一种可能的解决方法是通过反射使用IComparable接口:

public static int Compare(Object objA, Object objB)
{
    Type comparableType = typeof(IComparable<>).MakeGenericType(objA.GetType());
    MethodInfo compareMethod = comparableType.GetMethod("CompareTo");
    return (int)compareMethod.Invoke(objA, new[] { objB });
}

但是,它会更慢,并且只有当objB类型可以转换为objA类型时才会工作。

一个可能的解决方法是通过反射使用IComparable接口:

public static int Compare(Object objA, Object objB)
{
    Type comparableType = typeof(IComparable<>).MakeGenericType(objA.GetType());
    MethodInfo compareMethod = comparableType.GetMethod("CompareTo");
    return (int)compareMethod.Invoke(objA, new[] { objB });
}

但是,它会更慢,并且只有当objB类型可以转换为objA类型时才会起作用。

如果只处理数值,您可以使用以下方法解决Nenad描述的问题:

public static int Compare(Object objA, Object objB)
{
    object objB_as_AType = System.Convert.ChangeType(objB, objA.GetType());
    return (((IComparable)objA).CompareTo(objB_as_AType));
}

但是要非常小心,因为您假设A是不需要任何检查的I可比较的,并且您必须保证所涉及的类型之间有相互转换。

如果只处理数值,您可以使用以下方法解决Nenad描述的问题:

public static int Compare(Object objA, Object objB)
{
    object objB_as_AType = System.Convert.ChangeType(objB, objA.GetType());
    return (((IComparable)objA).CompareTo(objB_as_AType));
}

但是要非常小心,因为您假设A是不需要任何检查的i可比较的,并且您必须保证所涉及的类型之间确实存在相互转换。

如果您只是比较数字,这将适用于大多数情况:

public static int Compare(Object objA, Object objB) 
{ 
   return (((IComparable)Convert.ToDouble(objA)).CompareTo(Convert.ToDouble(objB))); 
} 

如果您只是比较数字,这将适用于大多数情况:

public static int Compare(Object objA, Object objB) 
{ 
   return (((IComparable)Convert.ToDouble(objA)).CompareTo(Convert.ToDouble(objB))); 
} 

要做到这一点,您必须构建自己的逻辑,主要是因为只有您知道底层比较应该做什么

e、 g以你为例,比较

int i = 10;
double d = 10.2;
这些是平等的吗?是否应将整数提升为双精度,然后进行比较?那么不,不相等。 应该将double截断为整数吗?那么是的,他们是平等的

在静态方法中,需要检查A和B的类型是否相同,如果相同,则可以调用A.compareTob

如果没有,那么您需要决定如何比较不同的类型,并在静态方法中实现该解决方案


希望这对你有所帮助,你必须建立自己的逻辑来做这件事,主要是因为只有你知道潜在的比较应该做什么

e、 g以你为例,比较

int i = 10;
double d = 10.2;
这些是平等的吗?是否应将整数提升为双精度,然后进行比较?那么不,不相等。 应该将double截断为整数吗?那么是的,他们是平等的

在静态方法中,需要检查A和B的类型是否相同,如果相同,则可以调用A.compareTob

如果没有,那么您需要决定如何比较不同的类型,并在静态方法中实现该解决方案

希望这有帮助