C# 由于整数溢出,OrderByDescending操作不正确
在浏览可枚举类的.Net Framework源代码时,我发现其用于排序的内部EnumerableSorter类有以下行: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;
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