6

这两种方法有什么区别?

第一的:

public static int Foo<T>(T first, T second) where T:IComparable
{
    return first.CompareTo(second)
}

第二:

public static int Foo(IComparable first, IComparable second)
{
    return first.CompareTo(second);
}
4

2 回答 2

13

对于第一种方法,两个参数的类型必须相同,例如,intint。类型必须实现IComparable接口。

对于第二种方法,两个参数可以有不同的类型。两种类型都必须实现IComparable接口,但不必相同,例如intstring

请注意,如果类型不同, IComparable.CompareTo 方法可能会引发异常。所以最好确保类型实际上是相同的。您可以使用第一种方法来做到这一点,或者使用通用IComparable<T> 接口更好。


后续问题当然是:这两种方法有什么区别?

第一的:

public static int Foo<T1, T2>(T1 first, T2 second) where T1 : IComparable<T2>
{
    return first.CompareTo(second);
}

第二:

public static int Foo<T>(IComparable<T> first, T second)
{
    return first.CompareTo(second)
}

回答:第一种方法不会将第一个参数装箱,而第二种方法会。

于 2013-01-21T10:48:40.990 回答
1

从提供的代码片段可以说,

泛型版本:

  • 对于泛型,将为定义的每种类型生成新代码

Foo<Class1>, Foo<Class2>, Foo<Class3>.

  • 你需要在编译时定义一个类型

接口版本:

  • 受益于 OOP 概念,从实际代码中隐藏实现细节。

  • 运行时类型定义(更灵活),但就该词的纯意义而言,“通用”较少。

一般来说:接口版本更灵活但通用性较低(顺便说一句,一切自然取决于具体的代码实现)。

于 2013-01-21T10:49:49.550 回答