这两种方法有什么区别?
第一的:
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);
}
对于第一种方法,两个参数的类型必须相同,例如,int
和int
。类型必须实现IComparable
接口。
对于第二种方法,两个参数可以有不同的类型。两种类型都必须实现IComparable
接口,但不必相同,例如int
和string
。
请注意,如果类型不同, 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)
}
回答:第一种方法不会将第一个参数装箱,而第二种方法会。
从提供的代码片段可以说,
泛型版本:
Foo<Class1>
, Foo<Class2>
, Foo<Class3>
.
接口版本:
受益于 OOP 概念,从实际代码中隐藏实现细节。
运行时类型定义(更灵活),但就该词的纯意义而言,“通用”较少。
一般来说:接口版本更灵活但通用性较低(顺便说一句,一切自然取决于具体的代码实现)。