如何在c#中对未知类型的装箱数字使用比较运算符?

如何在c#中对未知类型的装箱数字使用比较运算符?,c#,linq,reflection,linq-expressions,comparison-operators,C#,Linq,Reflection,Linq Expressions,Comparison Operators,我想要构建比较两个对象的值并与内置比较运算符行为相同的函数。我无法在编译时知道对象的类型,只能作为对象访问它们。基于这些原因,任何依赖于将它们转换为其底层类型或将函数更改为泛型的解决方案都不会有帮助 我天真的第一个实现是: bool LessThan(object left, object right) { return left < right; } 当两个对象的类型相同但出现如下错误时 System.InvalidOperationException : The binary

我想要构建比较两个对象的值并与内置比较运算符行为相同的函数。我无法在编译时知道对象的类型,只能作为对象访问它们。基于这些原因,任何依赖于将它们转换为其底层类型或将函数更改为泛型的解决方案都不会有帮助

我天真的第一个实现是:

bool LessThan(object left, object right) {
    return left < right;
}
当两个对象的类型相同但出现如下错误时

System.InvalidOperationException : The binary operator LessThan is not defined for the types 'System.Single' and 'System.Double'.
当对象具有不同类型时

是否可以将它们都转换为双精度,然后进行比较

bool LessThan(object left, object right) {
    return ((double) Convert.ChangeType(left, typeof(double))
         < ((double) Convert.ChangeType(right, typeof(double));
}
bool-LessThan(对象左,对象右){
return((双精度)Convert.ChangeType(左,typeof(双精度))
<((双)转换.ChangeType(右,typeof(双));
}
这似乎给出了所需的行为,但我怀疑转换在某些情况下会导致信息丢失


有更好的解决方案吗?

我认为最懒惰的解决方案是:

bool LessThan(dynamic left, dynamic right) {
    return left < right;
}
bool-LessThan(动态左、动态右){
返回左<右;
}
如果确实无法比较这两种类型,那么这当然会生成运行时异常

这似乎给出了所需的行为,但我怀疑转换在某些情况下会导致信息丢失


如果你比较一个
Double
和一个
Single
,C#将把
Single
转换成
Double
。否则它们无法进行比较。

我认为最懒的解决方案是:

bool LessThan(dynamic left, dynamic right) {
    return left < right;
}
bool-LessThan(动态左、动态右){
返回左<右;
}
如果确实无法比较这两种类型,那么这当然会生成运行时异常

这似乎给出了所需的行为,但我怀疑转换在某些情况下会导致信息丢失


<> >如果比较“代码>双代码/代码>和<代码>单< /代码>,C将把<代码>单< /代码>转换成<代码>双< /代码>。它们不能进行比较。

您是否考虑使用ICMPLAPARTY?我确实尝试将它们转换成ICM,但不包括这些运算符。支持LINQ类的不同类型的问题。您是否考虑使用ICMPLAPARTY?我确实尝试将它们转换为ICMPLABLE,但不包括这些运算符。它有<代码> CuasReto 。但是这与支持LINQ的不同类型的问题是相同的。我正在想更多关于<代码>长< /COD>。a
double
由于其对数性质,可能会出现问题。您知道这是否是比较这两种类型时发生的转换吗?我希望不添加额外的程序集引用,但我没有提到这一点,并且您的解决方案是一个很好的解决方案。@Ivana当您比较a
long
double
,则
long
将转换为
double
。可能会丢失信息,因为double的精度只有53位(并非每个
long
都可以用
double
表示)例如,4000000000000000001d和4000000000000000000L将被视为相等。但你无论如何也无能为力。C#必须将两者转换为另一个以进行比较。但你可以让
动态
处理这一点。我更多考虑的是将
长的
转换为
双的
由于它们的对数性质,可能会出现问题。您知道这是否是比较这两种类型时发生的转换吗?我希望不添加额外的程序集引用,但我没有提到这一点,而且您的解决方案很好。@Ivana当您比较长的
和双的
时de>long
将转换为
double
。可能会丢失信息,因为double的精度只有53位(并非每个
long
都可以用
double
表示)例如,4000000000000000001d和4000000000000000000L将被视为相等。但您对此无能为力。C#必须将两者转换为另一个以进行比较。但您可以让
动态
处理这一问题。
bool LessThan(dynamic left, dynamic right) {
    return left < right;
}