我有一个接受IComparable
public static void sort(IComparable[] a){//...}
如果我向此函数发送一个字符串数组,则会被接受,但即使结构Int32
扩展IComparable
,也不会接受一个整数数组。
public struct Int32 : IComparable, IFormattable,
IConvertible, IComparable<int>, IEquatable<int>
第一个问题是为什么不可能向这样的函数发送值类型数组。
第二个问题是我应该如何将值类型数组发送到接受IComparable
数组的函数。
答案 0 :(得分:8)
虽然int
是IComparable
,但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
时就可以避免拳击。)