BigInteger.Equals(Object obj)中的隐式转换如何工作?

时间:2012-09-12 15:26:02

标签: c# implicit-conversion

我正在查看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 个答案:

答案 0 :(得分:3)

ILSpy目前的实施:

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

至少,文件的措辞可能会被误导。这意味着BigInteger从中衍生的任何东西都会隐式转换为BigInteger,因此会被投射到BigInteger以进行测试平等。

struct的当前定义意味着没有任何内容可以来自BigInteger,因此文档在该声明中实际上有点无意义。

您可能会对用户定义的implicit运算符感到困惑,该运算符将用于将intshort等存储在{ {1}}“隐式”代码:

BigInteger