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

Hor*_*rea 5 c# icomparable value-type reference-type

我有一个接受数组的C#函数 IComparable

public static void sort(IComparable[] a){//...}
Run Code Online (Sandbox Code Playgroud)

如果我向这个函数发送一个字符串数组,它被接受,但即使结构Int32扩展,也不接受一个int数组IComparable.

public struct Int32 : IComparable, IFormattable, 
IConvertible, IComparable<int>, IEquatable<int>
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 9

虽然int是一个IComparable,一个int[]不是IComparable[].想象一下,如果它是:

int[] x = new int[10];
IComparable[] y = x;
y[0] = "hello";
Run Code Online (Sandbox Code Playgroud)

这将试图存储引用int[].不良.

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

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

public static void Sort<T>(T[] array) where T : IComparable
Run Code Online (Sandbox Code Playgroud)

或者甚至更好地使用以下的通用形式IComparable:

public static void Sort<T>(T[] array) where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)

(那样你打电话就可以避免拳击CompareTo.)