具有一个十进制字段且默认等于的结构

时间:2015-03-30 12:08:04

标签: c# decimal

默认Equals()如何在这样的结构上工作:

public struct Decim
{
    decimal x;

    public Decim (decimal x)
    {
        this.x = x;
    }
}

new Decim(-0m).Equals (new Decim(0m));返回true,为什么?如果它进行逐位比较,我认为十进制使用特殊位来表示符号

new Decim(5.00m).Equals (new Decim(5.000000m));报告也是如此,但当我执行new Decim(5.00m).ToString()new Decim(5.000000m)).ToString()时,它会生成不同的值。字符串怎么知道呢?

2 个答案:

答案 0 :(得分:0)

这是来自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;
}

你可以理解Equals的作用。

来源:Original StackOverflow post

答案 1 :(得分:0)

找到它:Can anyone explain this strange behavior with signed floats in C#?

默认等于:

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

S默认等于将使用十进制字段的反射。对于double,它会执行fastEqualsCheck。