代码之家  ›  专栏  ›  技术社区  ›  joshcomley

如何比较.NET中两个装箱数字的相等性?

  •  3
  • joshcomley  · 技术社区  · 14 年前

    假设我有以下完全没有意义的代码:

    object val1 = 1;
    object val2 = 1l;
    

    下面将返回false,因为这两个框 物体 不同的是,作为对象,它们有不同的类型:

    val1 == val2
    

    同样适用于:

    val1.Equals(val2)
    

    或:

    Object.Equals(val1, val2)
    

    考虑到 不知道运行时的类型 (因此不能转换):

    1 == 1l;
    

    换句话说,我如何得到 价值 基于二者的比较 盒装的 数字?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Jonathan    13 年前

    尝试使用 动态 关键字。它将把对象解析为您的值类型,以便您可以使用==运算符并比较真值:

    (dynamic)val1 == (dynamic)val2
    
        2
  •  3
  •   Basic    14 年前

    如果是特定类型的对象,则可以使用 .Equals() 方法来检查相等性-可以是支持它的标准.Net类型之一,也可以将其添加到您自己的对象中。

    如果失败了,你可以把它们转换成一个已知的类型,如果你事先知道它是什么的话

    从cdhowie那里得到了好的观点,所以。。。

    我可能遗漏了一些东西,但你知道它们是问题/标签标题中的数字-除非你有一些用于存储数字的自定义类型,否则你不能简单地将所有内容转换为Long(或ULong if+ve only)然后进行比较吗?

        3
  •  1
  •   Brian    14 年前

    如果您不知道类型,那么我认为您必须进行一些反射,以确定需要什么方式来比较数据。

        4
  •  0
  •   johnDisplayClass    13 年前

    我看了一眼 System.ValueType.Equals(对象,对象)

    但是,使用Reflector可以看到,如果类型不匹配,此方法将特别返回false。

    你可以尝试扩展你自己的方法,比如说, object.ValueEquals(对象,对象) ,使用Reflector中的代码并消除该检查。

    值得一试。