C# 为什么运行时肯定会失败的List.Sort会编译?
我在四处玩,想看看如果我创建不实现比较运算符的对象的C# 为什么运行时肯定会失败的List.Sort会编译?,c#,C#,我在四处玩,想看看如果我创建不实现比较运算符的对象的列表,并调用.Sort(),会出现什么编译器错误。 我很惊讶它编译后在运行时崩溃了: [System.ArgumentException: At least one object must implement IComparable.] at System.Collections.Comparer.Compare(Object a, Object b) at System.Collections.Generic.ObjectComp
列表,并调用.Sort()
,会出现什么编译器错误。
我很惊讶它编译后在运行时崩溃了:
[System.ArgumentException: At least one object must implement IComparable.]
at System.Collections.Comparer.Compare(Object a, Object b)
at System.Collections.Generic.ObjectComparer`1.Compare(T x, T y)
at System.Collections.Generic.ArraySortHelper`1.InsertionSort(T[] keys, Int32 lo, Int32 hi, IComparer`1 comparer)
at System.Collections.Generic.ArraySortHelper`1.IntroSort(T[] keys, Int32 lo, Int32 hi, Int32 depthLimit, IComparer`1 comparer)
at System.Collections.Generic.ArraySortHelper`1.IntrospectiveSort(T[] keys, Int32 left, Int32 length, IComparer`1 comparer)
at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
[System.InvalidOperationException: Failed to compare two elements in the array.]
at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
at System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
at System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, IComparer`1 comparer)
at System.Collections.Generic.List`1.Sort()
at Example.Main() :line 49
C#编译器允许编译此代码的原因是什么
注意:我希望很清楚,我不是在问如何修复我的代码,这很简单,我是在问为什么要编译这个错误代码。您可以通过实现IComparer
接口来提供一个自行编写的比较器。如果没有,它将查找Comparer.Default
,以获得一个。因此,从技术上讲,在对象未实现Icomparable
的列表上调用Sort()
是可以的,因为此时将使用Comparer.Default
。这意味着您可以在任何列表上调用Sort()
,而不受值必须实现IComparable
的限制。但这也意味着您无法在编译时检查comparer中是否有可用的比较器。默认情况下,Sort()
源代码在内部使用比较器。您可以通过实现IComparer
接口来提供一个自编比较器。如果没有,它将查找Comparer.Default
,以获得一个。因此,从技术上讲,在对象未实现Icomparable
的列表上调用Sort()
是可以的,因为此时将使用Comparer.Default
。这意味着您可以在任何列表上调用Sort()
,而不受值必须实现IComparable
的限制。但这也意味着您无法在编译时检查comparer中是否有可用的比较器。默认情况下,Sort()
源代码在内部使用比较器。,如果在运行时使用反射使类实现IComparable
,会怎么样?我们可以看到您的吗?为什么.NET允许编译:1/0?我觉得在某种程度上,你必须期望开发人员在体系结构的约束下工作。C#编译器几乎没有任何关于.NET Framework类的内置知识。我猜它对List
或ObjectComparer
一无所知,更不用说如果不满足另一个的约束,其中一个将失败。根据这个逻辑,任何可能引发异常的方法调用都不应该编译。。?编译时和运行时检查是不同的。那么,如果在运行时使用反射使类实现IComparable
,该怎么办?我们可以看到您的吗?为什么.NET允许编译:1/0?我觉得在某种程度上,你必须期望开发人员在体系结构的约束下工作。C#编译器几乎没有任何关于.NET Framework类的内置知识。我猜它对List
或ObjectComparer
一无所知,更不用说如果不满足另一个的约束,其中一个将失败。根据这个逻辑,任何可能引发异常的方法调用都不应该编译。。?编译时和运行时检查是不同的。