2

我想借助IComparable<T>.CompareTo名为. 我写TPath

var shortest = new List<Path>();
//Fill shortest with elements != null
if (shortest.Contains(null))
      throw new System.Exception("Path is null");
shortest.Sort();
if (shortest.Contains(null))
      throw new System.Exception("Path is null");

令我惊讶的是,该方法

    int IComparable<Path>.CompareTo(Path other)
    {
        if (other == null)
            return -1;

        if (!other.valid)
            return 1;

        if (pfad.Count() > other.pfad.Count())
        {
            return -1;
        }
        else if (pfad.Count() < other.pfad.Count())
        {
            return 1;
        }
        else
        {
            if (length > other.length)
                return -1;
            else
                return 1;

        }

    }

从课堂上

 public class Path : IComparable<Path>

Sort()with调用other==null。我更惊讶的是,在第一个代码块中,抛出了第二个异常,这意味着shortest在排序之后而不是之前包含一个空值。

4

2 回答 2

1

虽然我无法解释为什么 Sort 需要与 null 进行比较,但 IComparable.CompareTo 的文档明确指出:

根据定义,任何对象比较大于(或跟随)null,并且两个 null 引用比较彼此相等。

因此,无论原因是什么,CompareTo 的实现都必须遵循此规则和其他规则,以确保与 Sort() 等兼容。

于 2013-01-28T14:56:32.030 回答
1

你的CompareTo功能坏了。当一个对象与其自身进行比较时它不会返回,并且当两个对象被比较时0它总是返回。所以可能有两个对象和与和这可能会导致行为奇怪。1valid == falseaba.CompareTo(b) == 1b.CompareTo(a) == 1Sort()

此外,正如在另一个答案中已经指出的那样,它应该返回1if other == null。(当列表不包含时应该不重要null

于 2013-01-28T15:24:46.017 回答