C# 具有一个十进制字段且defautl等于的结构

C# 具有一个十进制字段且defautl等于的结构,c#,decimal,C#,Decimal,default Equals如何在如下结构上工作: public struct Decim { decimal x; public Decim (decimal x) { this.x = x; } } 新分贝-0m。等于新分贝0m;回归真,为什么?若它进行按位比较,我认为十进制使用特殊的位来表示符号 同样,新的分贝5.00m等于新的分贝5.000000m;报告为true,但当我执行new Decim5.00m.ToString和new Dec

default Equals如何在如下结构上工作:

public struct Decim
{
    decimal x;

    public Decim (decimal x)
    {
        this.x = x;
    }
}
新分贝-0m。等于新分贝0m;回归真,为什么?若它进行按位比较,我认为十进制使用特殊的位来表示符号


同样,新的分贝5.00m等于新的分贝5.000000m;报告为true,但当我执行new Decim5.00m.ToString和new Decim5.000000m.ToString时,它会生成不同的值。to string是如何知道的?

这是mscorlib中Equals的反编译版本:

public override bool Equals(object obj)
{
    if (obj == null)
    {
        return false;
    }
    RuntimeType type = (RuntimeType) base.GetType();
    RuntimeType type2 = (RuntimeType) obj.GetType();
    if (type2 != type)
    {
        return false;
    }
    object a = this;
    if (CanCompareBits(this))
    {
        return FastEqualsCheck(a, obj);
    }
    FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
    for (int i = 0; i < fields.Length; i++)
    {
        object obj3 = ((RtFieldInfo) fields[i]).InternalGetValue(a, false);
        object obj4 = ((RtFieldInfo) fields[i]).InternalGetValue(obj, false);
        if (obj3 == null)
        {
            if (obj4 != null)
            {
                return false;
            }
        }
        else if (!obj3.Equals(obj4))
        {
            return false;
        }
    }
    return true;
}
你可以理解平等者做什么

来源:

找到它:

默认情况下等于:

if (CanCompareBits(this)) // will return false for decimal
{
    return FastEqualsCheck(a, obj);
}

因此,defauklt equals将对十进制字段使用反射。对于double,它将执行fastEqualsCheck。

这是两个问题……那么,为什么我不为十进制输入CanCompareBits,但当我将字段更改为double时,它会输入?CanCompareBits是如何工作的?看不见,因为它的外部。