Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么运行时肯定会失败的List.Sort会编译?_C# - Fatal编程技术网

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
一无所知,更不用说如果不满足另一个的约束,其中一个将失败。根据这个逻辑,任何可能引发异常的方法调用都不应该编译。。?编译时和运行时检查是不同的。