如何将一个int数组发送到一个接受IComparable数组的函数?

时间:2015-01-29 15:17:47

标签: c# value-type reference-type icomparable

我有一个接受IComparable

数组的C#函数
public static void sort(IComparable[] a){//...}

如果我向此函数发送一个字符串数组,则会被接受,但即使结构Int32扩展IComparable,也不会接受一个整数数组。

public struct Int32 : IComparable, IFormattable, 
IConvertible, IComparable<int>, IEquatable<int>

第一个问题是为什么不可能向这样的函数发送值类型数组。

第二个问题是我应该如何将值类型数组发送到接受IComparable数组的函数。

1 个答案:

答案 0 :(得分:8)

虽然intIComparable,但int[]不是IComparable[]。想象一下,如果是:

int[] x = new int[10];
IComparable[] y = x;
y[0] = "hello";

那将尝试在int[]中存储引用。不良。

基本上,值类型数组不是协变的。 (引用类型数组在编译时是协变的,但是如果你试图在执行时存储一个无效的值,它会抛出。这是一个设计缺陷IMO,但没关系......)

解决这个问题的方法是使用泛型:

public static void Sort<T>(T[] array) where T : IComparable

甚至更好地使用IComparable的通用形式:

public static void Sort<T>(T[] array) where T : IComparable<T>

(这样你打电话CompareTo时就可以避免拳击。)