NullReferenceException,其中只有变量是结构体

时间:2014-10-15 15:56:53

标签: c# .net

对于来自相同代码的2个用户来说,我一直会遇到一个非常令人困惑的例外,这个代码可以运行大约250个其他用户。

在进行排序时,NullReferenceException方法中的CompareTo。 callstack的顶部是:

at MyApp.Database.IndexablePropertyValue.CompareTo(IndexablePropertyValue other)
at MyApp.Database.IndexablePropertyValue.CompareTo(Object obj)

来自CompareTo的{​​{1}}方法

IndexablePropertyValue

永远不会抛出public int CompareTo(IndexablePropertyValue other) { int result = m_propertyId.CompareTo(other.m_propertyId); if(result != 0) return result; return m_dropDownValueId.CompareTo(other.m_dropDownValueId); } public int CompareTo(object obj) { if(obj == null) throw new ArgumentNullException("obj"); return CompareTo((IndexablePropertyValue)obj); } 。令人困惑的部分是ArgumentNullException和用于IndexablePropertyValue&的m_propertyId类型。 m_dropDownValueId值(Suid)都是结构。

由于异常是从优化构建产生的,因此CompareTo结构中的Suid方法可能已内联,因此这里是CompareTo结构中的Suid方法:

    public int CompareTo(object obj)
    {
        Suid other = (Suid)obj;
        int result = s.CompareTo(other.s);
        if(result != 0)
            return result;
        return d.CompareTo(other.d);
    }

变量sd是结构的可变Int32字段。 (使它们不可变当然会更好,但是我们的一些序列化代码不支持它。)

结构的签名:

public struct IndexablePropertyValue : IComparable<IndexablePropertyValue>, IComparable
public struct Suid : IComparable, IEquatable<Suid>

我不明白NullReferenceException方法中CompareTo是如何实现的。希望有人能够了解它是如何可能的。或许特定框架版本中的错误?我们的目标是4.5。

0 个答案:

没有答案