对于来自相同代码的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);
}
变量s
和d
是结构的可变Int32
字段。 (使它们不可变当然会更好,但是我们的一些序列化代码不支持它。)
结构的签名:
public struct IndexablePropertyValue : IComparable<IndexablePropertyValue>, IComparable
public struct Suid : IComparable, IEquatable<Suid>
我不明白NullReferenceException
方法中CompareTo
是如何实现的。希望有人能够了解它是如何可能的。或许特定框架版本中的错误?我们的目标是4.5。