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.
虽然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.)
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |