我正在为我的班级库测试IComparer接口的实现。我有两个版本的实现,它会一样吗? (问题1)
class Inventory
{
public string name;
double cost;
int onhand;
public Inventory(string n, double c, int h)
{ //... }
}
}
class CustomInvComparer : IComparer<Inventory>
{
public int Compare(Inventory x, Inventory y)
{
return string.Compare(x.name, y.name, StringComparison.Ordinal);
}
}
class CompInv<T> : IComparer<T> where T : Inventory
{
public int Compare(T x, T y)
{
return string.Compare(x.name, y.name, StringComparison.Ordinal);
}
}
为什么,在实现IC32arer接口的int32和字符串,不起作用的“第二个变种”(没有评论将是主要错误CS0701)。我知道从语法“对类型参数的约束(C#编程指南)”的角度来看,“第二个变体”(注释)是不正确的,但我没有看到与上述变体“T:Inventory”的逻辑差异? (问题2)
class CustomStringComparer : IComparer<System.String>
{
public int Compare(System.String x, System.String y)
{
return x.CompareTo(y);
}
}
//class CompStr<T> : IComparer<T> where T : System.String
//{
// public int Compare(T x, T y)
// {
// return string.Compare(x, y, StringComparison.Ordinal);
// }
//}
class CustomIntComparer : IComparer<System.Int32>
{
public int Compare(System.Int32 x, System.Int32 y)
{
return x.CompareTo(y);
}
}
//class CompStr<T> : IComparer<T> where T : System.Int32
// {
// public int Compare(T x, T y)
// {
// return string.Compare(x, y, StringComparison.Ordinal);
// }
//}
我有两个版本的实现,它会一样吗? (问题1)
你的两个IComparer<T>
实现具有完全相同的逻辑,因此从这个意义上说它们将完全相同。唯一的不同之处在于,通用版本不仅可以用于比较Inventory
的类型,还可以用于Inventory
的任何子类。
由于通用接口中的via类型参数方差,您可以将非泛型版本与使用Inventory
子类的场景一起使用,这种差异没有太大的实际意义。您应该能够在完全相同的情况下使用它们。
至于你的第二个问题:
为什么,在实现IC32arer接口的int32和字符串,不起作用的“第二个变种”(没有评论将是主要错误CS0701)
答案就在the error message:
用作约束的类型必须是接口,非密封类或类型参数。
System.String
是一个密封的类,System.Int32
根本不是一个类。它们都不是接口或类型参数。因此,两者都不能作为约束。
更实际地说:密封类和值类型(结构,即像System.Int32
这样的东西)不是有效约束的原因是它们作为约束没有任何意义。约束允许type参数是继承约束类型的类型。但是密封类和值类型不能具有继承类型。因此,使用它们作为约束将提供零利益。在这种情况下,您也可以省略type参数并明确使用该类型。