如何确定C#方法参数的适当类型?

6
在Haskell中,我最熟悉的语言,有一种相当精确的方法来确定变量的类型。然而,在学习C#的过程中,我在这方面有些困惑。例如,Array.Sort方法的签名如下:
public static void Sort(
    Array array
)

然而,如果参数为null、多维数组或不实现IComparable接口,则此方法将引发异常。因此,如果可能的话,为什么不使用类型IComparable[]呢?


7
因为这种方法定义不够清晰(按照现今的标准),而且在编写该方法时,许多用于应用某些限制的工具在.NET 1.0中并不存在。 - Servy
1
你的标题有点太笼统了。你想要这个问题的答案吗?那么这是一个主观的、基于意见的问题。如果你只想要关于 Array.Sort 的具体问题的答案,那么这个标题就不合适了。 - Tim Schmelter
1
如果您查看实际的实现... 可能会调用对 ArrayTrySZSort 调用。 这是一个内部 CLR 调用,可能期望的是 Array.. 而不是实现 IComparable 的内容。 - Simon Whitehead
@SimonWhitehead IComparable[](即不是IComparable)是一个Array - millimoose
我早上这个点有点迟钝。谢谢@millimoose。 - Simon Whitehead
1个回答

11
如果今天写这个方法,你可能会使用类似下面的代码:
public static void Sort<T>(T[] array)
    where T : IComparable // or even IComparable<T>
{ ... }

这不能在编译时强制执行数组不是null(可悲的是),但它可以确保数组是可比较的类型,且为单维数组。空值检查仍需要运行时检查。
但这依赖于泛型,在.NET 2.0之前未添加到语言中。(这还使用了方法级别的泛型,而不是类级别的泛型,在.NET 3.5之前也没有添加)Array.Sort 在.NET 1.0中添加到语言中。它没有改变,因为那将是一个破坏性的变化,而语言设计师选择不进行更改。

太好了,这看起来更加熟悉和合理。 - user2939875
1
这种重载实际上几乎存在,就是public static void Sort<T>(T[] array)(没有IComparable约束),它在 .Net 2.0 中被添加。 - svick
1
当然,如果同一个方法有一个不那么严格的重载,这意味着当您传递无效数组时,您不会得到编译时错误。将其作为附加重载的唯一优点是该方法可以避免装箱,而不像Array。如果它有一个不同的名称,那么您可以确保在传递无效数组而不是运行时错误时获得编译器错误。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接