为什么默认比较器认为 null 小于某个值

lon*_*nix 0 c# types nullable

文档Compare(T? x, T? y)说:

\n
\n

返回:
\n一个有符号整数,表示 x 和 y 的相对值
\n小于零 \xe2\x80\x93 x 小于 y。
\n零 \xe2\x80\x93 x 等于 y。
\n大于零 \xe2\x80\x93 x 大于 y。

\n
\n

考虑这个例子:

\n
using System;\nusing System.Collections.Generic;\n                    \npublic class Program\n{\n    public static void Main()\n    {\n        Console.WriteLine(Comparer<int?>.Default.Compare(null, 1)); // -1   ?huh?\n        Console.WriteLine(Comparer<int?>.Default.Compare(-1, 1));   // -1\n        Console.WriteLine(Comparer<int?>.Default.Compare(1, 1));    //  0\n        Console.WriteLine(Comparer<int?>.Default.Compare(2, 1));    //  1\n        \n        Console.WriteLine((int?)null < 1);                          // False\n        Console.WriteLine((int?)null == 1);                         // False\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

null“小于”某个值也是如此。-2如果它返回一个不同的幻数(例如),或者抛出异常,或者其他什么,我不会感到惊讶。

\n

正如预期的那样,并且null < 1是错误的,这似乎与上述相反。

\n

这是否有什么原因,或者只是一个需要注意的 API 怪癖?

\n

Mar*_*ell 6

它需要根据IComparable<T>/进行定义的比较IComparer<T>,并且它选择了null其他任何东西都小的比较。这是在这里指定的。唯一的其他选择是抛出异常,大多数人会认为这是一件坏事,因为它会破坏任何包含空值的排序。

<运算符是完全独立的false,并且当任一操作数为 时选择返回null。尽管看起来不直观:CompareTo并且<不需要完全一致