代码之家  ›  专栏  ›  技术社区  ›  Joel Rondeau

BigInteger.Equals(Object obj)中的隐式强制转换是如何工作的?[已关闭]

  •  1
  • Joel Rondeau  · 技术社区  · 13 年前

    我查看了BigInteger的文档,并在 BigInteger.Equals(Object obj) 方法:

    如果obj参数不是BigInteger值,但它是定义了隐式转换的数据类型,则Equals(Object)方法在执行比较之前将obj转换为BigInteger。

    然后我开始想,考虑到从对象转换需要显式强制转换,我将如何进行此操作。我想出的最好办法如下:

    Type type = obj.GetType()
    if(type == typeof(byte))
    {
      byte b = (byte)obj;
      return Equals(b);
    }
    if(type == typeof(short))
    {
      short s = (short)obj;
      return Equals(s);
    }
    //Continue for all types that can be implicitly cast to BigInteger.
    

    在我看来,有一种更简单的方法可以做到这一点,但我却错过了。那么,考虑到我是从一个对象开始的,还有什么其他方法可以进行隐式转换呢?

    1 回复  |  直到 13 年前
        1
  •  3
  •   Adam Houldsworth    13 年前

    ILSpy的当前实现:

    return obj is BigInteger && this.Equals((BigInteger)obj);
    

    至少该文件的措辞可以被视为具有误导性。它的意思是 BigInteger 任何源自它的东西 将具有隐含的强制转换为 大整数 因此将被铸造成 大整数 为了测试平等性。

    的当前定义 struct 将意味着无法从 大整数 ,所以文档在该声明中实际上有点毫无意义。

    您可能会混淆用户定义 implicit 运算符,这将被用来允许 int , short ,等存储在 大整数 代码中的“隐式”:

    BigInteger b = 1;