C# 由于整数溢出,OrderByDescending操作不正确

C# 由于整数溢出,OrderByDescending操作不正确,c#,linq,sorting,.net-4.6.1,C#,Linq,Sorting,.net 4.6.1,在浏览可枚举类的.Net Framework源代码时,我发现其用于排序的内部EnumerableSorter类有以下行: return descending ? -c : c; 其中c是方法调用的结果,这实际上并不强迫我们仅使用-1、1或0来表示顺序 考虑到由于整数溢出,它可能导致不正确的排序,以下代码段可以证明这一点: public class Value : IComparable<Value> { private readonly Int32 _value;

在浏览可枚举类的.Net Framework源代码时,我发现其用于排序的内部EnumerableSorter类有以下行:

return descending ? -c : c;
其中
c
是方法调用的结果,这实际上并不强迫我们仅使用-1、1或0来表示顺序

考虑到由于整数溢出,它可能导致不正确的排序,以下代码段可以证明这一点:

public class Value : IComparable<Value>
{
    private readonly Int32 _value;
    public Value(Int32 value)
    {
        this._value = value;
    }

    public Int32 CompareTo(Value other)
    {
        if (other == null)
            throw new ArgumentNullException(nameof(other));
        var cmp = this._value.CompareTo(other._value);
        if (cmp > 0)
            return Int32.MaxValue;
        if (cmp < 0)
            return Int32.MinValue;
        return 0;
    }

    public override String ToString()
    {
        return this._value.ToString();
    }
}

private static void Print<T>(String header, IEnumerable<T> values)
{
    Console.WriteLine(header);
    foreach (var item in values)
    {
        Console.WriteLine(item);
    }
    Console.WriteLine();
}

public static void Main()
{
    try
    {
        var notSorted = new[] { 1, 3, 2 }
            .Select(i => 
                new Value(i))
            .ToArray();

        Print("Not sorted", notSorted);
        Print("Sorted by", notSorted.OrderBy(item => item));
        Print("Sorted by descending", notSorted.OrderByDescending(item => item));
    }
    catch (Exception exc)
    {
        Console.WriteLine(exc);
    }
    Console.WriteLine("Press any key...");
    Console.ReadKey(true);         
}
这是意料之中的,但这也是一个明显不正确的结果

因此,这似乎是.Net中的一个缺陷,但如果以合理的方式实现
相比,则不太可能出现这种缺陷。我说得对吗

更新:

正如问题所指出的,这个问题已经被人们知道很长一段时间了,但尽管发布了所有的新版本,它仍然没有得到修复-


正如.Net Core所指出的,这个问题已经解决了-

似乎没有太多的答案,因此:

正如SLaks所指出的,这个问题早就为人所知了,但是在.NET框架中,从未被修复过,尽管有了所有的新版本(.NET 4.6.1至今)-

避免此问题的唯一方法是不将
CompareTo中的
Int32.MinValue
返回到
实现



但是正如usr所指出的那样。Net Core已经修复了这个问题。-

看起来已经修复:@EugenePodskal实际上我指的是connect上无数的bug,它们被关闭为“无法修复”。我认为我个人报告的每一个bug都是这样关闭的。没错,我再也没有在Connect上报告过。这是虫子的坟墓。无论是谁在处理这些问题,他们的目标都必须是尽可能多地达成一致。可能是与每天“解决”的问题相关的奖金。github回购协议中有反应非常迅速的人(开发人员)。@usr:确实,连接错误经常被关闭为“无法修复”。但问题是,由于开发人员资源的限制(特别是在处理遗留API时),花时间修复bug是不够重要的。我报告了许多要连接的bug,虽然有些bug已经关闭“无法修复”,但最严重的问题最终得到了修复(例如.NET中gzip支持的8GB限制)。在任何情况下,它确实是唯一可以报告bug的地方,并确保微软至少会考虑修复它。 Sorted by descending 3 1 2