根据文件:
System.Array.Sort<T>
- 使用System.Array的每个元素的System.IComparable泛型接口实现对整个System.Array中的元素进行排序。
今天我发现,这段代码正在编译,没有任何错误和警告:
A []arr = new A[10];//A is not inheriting from IComparable !!
//initializing elements of arr
...
System.Array.Sort<A>(arr);
执行后我遇到了运行时错误。
那么为什么这段代码正在编译?我不是C#的专家,但我知道,C#泛型支持约束语法。为什么约束不用于Array.Sort?
答案 0 :(得分:2)
在编译中因为T
没有约束它必须实现IComparable<T>
。
我认为文档有点令人困惑,因为数组元素实际不必实现IComparable<T>
与调用相同的T
。例如,这很好用:
using System;
class Test
{
static void Main()
{
object[] objects = { "d", "b", "c", "a" };
Array.Sort<object>(objects);
}
}
我认为仅仅说元素必须“以某种方式”相互比较是更明智的。例如,这很好,即使没有实现泛型 IComparable
接口:
using System;
class A : IComparable
{
private readonly int value;
public A(int value)
{
this.value = value;
}
public int CompareTo(object other)
{
// Just cast for now...
return value.CompareTo(((A)other).value);
}
}
class Test
{
static void Main()
{
object[] objects = { new A(5), new A(3), new A(4) };
Array.Sort<object>(objects);
}
}