2

我想在运行时使用反射比较两个值。我为此使用了 Comparer.Default.Compare(x,y),但我开始意识到这还不够。假设我想将双精度与单精度进行比较(1.0 == 10)。Comparer.Default 将抛出异常,因为它坚持两个值必须是相同的类型(双精度)。但是,为此存在显式转换,这正是我想要使用的。

那么,为什么我不能只使用 Convert.ChangeType?以 1.25 > 1 (double > integer) 为例。如果我在 1.25 上尝试 Convert.ChangeType(1.25,typeof(int)),我将得到 1,而上面的断言将失败,而实际上 1.25 IS > 1。

那么,有人可以建议一种调用类型定义的显式比较(如果存在)的方法吗?

谢谢。

4

2 回答 2

5

您使用的是 C# 4 和 .NET 4 吗?如果是这样,使用动态类型真的很容易:

dynamic x = firstValue;
dynamic y = secondValue;
if (x > y) // Or whatever

编译器会为您执行所有适当的转换。

于 2010-09-21T15:36:37.477 回答
1

如果 C# 4 是一个选项,Jon Skeet 使用动态的建议很可能是理想的。

如果不是,那么...

没有明确的比较。编译器在编译时进行转换,然后调用适当的比较。

最好的办法是使用 Convert.ChangeType 转换为更宽的类型,然后对结果进行比较。如果您不想处理所有类型的检查,通常可以将两边都转换为decimal值,然后使用单个比较来检查它们,因为decimal应该充分处理所有值。

于 2010-09-21T15:37:12.780 回答