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

如何确定C#中方法参数的适当类型?,c#,.net,C#,.net,在我最熟悉的语言Haskell中,有一种相当精确的方法来确定变量的类型。然而,在学习C#的过程中,我在这方面有些困惑。例如,Array.Sort方法的签名是: public static void Sort( Array array ) 但是,如果参数是多维的null,或者未实现IComparable接口,则此方法将引发异常。那么,如果可能的话,为什么类型不是可比较的[] 如果你今天要写这个方法,你会用这样的方法: public static void Sort<T>(T[

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

public static void Sort(
    Array array
)

但是,如果参数是多维的
null
,或者未实现
IComparable
接口,则此方法将引发异常。那么,如果可能的话,为什么类型不是可比较的[]

如果你今天要写这个方法,你会用这样的方法:

public static void Sort<T>(T[] array)
    where T : IComparable // or even IComparable<T>
{ ... }
公共静态无效排序(T[]数组)
其中T:i可比//甚至i可比
{ ... }
这不能强制执行数组在编译时不为null(遗憾的是),但它可以确保数组的类型是可比较的,并且是一维的。空检查仍然需要是运行时检查


但这依赖于泛型,直到.NET2.0才添加到语言中。(这也使用方法级泛型,而不是类级泛型,它们直到.NET 3.5才被添加)
Array.Sort
被添加到.NET 1.0中的语言中。它没有被改变,因为这将是一个突破性的改变,语言设计者选择不做这个改变。

因为它是一个定义很差的方法(按照今天的标准),而且还因为应用这些限制的许多工具在.NET 1.0中不存在,写方法的时候,你的标题有点太笼统了。你想知道那个问题的答案吗?那么这是一个基于观点的主观问题。如果您只想回答有关
Array.Sort
的特定问题,则标题不合适。如果您查看实际实现。。可能会调用
Array
上的
TrySZSort
。这是一个内部CLR调用,可能需要一个
数组。。实现
IComparable
@SimonWhitehead
IComparable[]
(即不
IComparable
)的不是
数组。早上这个时候我有点基础。谢谢@millimoose.property,这看起来更熟悉、更合理。这种重载实际上几乎是存在的,(没有
IComparable
约束),是在.Net 2.0中添加的。@svick当然,当同一方法的重载限制较少时,这仍然意味着传入无效数组时不会出现编译时错误。将其作为额外重载的唯一优点是,该方法可以避免装箱,这与
数组
不同。如果它有不同的名称,那么可以确保传入无效数组时出现编译器错误,而不是运行时错误。