这些代码将以相同的方式工作(具有基本 class 约束的通用 Class 与非通用 Class "counterpart")
Will work these code the same (Generic Class with base class constraint vs Non-generic Class "counterpart")
我正在为我的 class 库存测试 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);
}
}
为什么在实现 int32 和字符串的 IComparer 接口时,"second variants" 不起作用(w/o 注释将是主要错误 CS0701)。 我知道 "second variants"(已评论)从语法的角度来看是不正确的 "Constraints on type parameters (C# Programming Guide)",但我没有看到与上述变体 "where 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);
// }
//}
I have two versions of it realization, will it works the same? (Question 1)
您的两个 IComparer<T>
实现具有完全相同的逻辑,因此从这个意义上讲,它们的工作方式完全相同。唯一的 material 区别是通用版本不仅可以比较 Inventory
的类型,还可以比较 Inventory
的任何子 class。
由于通过泛型接口中的类型参数差异,您可以在使用 Inventory
subclass 的场景中使用非泛型版本,这种差异没有太大的实际意义.您应该能够在完全相同的情况下使用它们。
就你的第二个问题而言:
And why, in cases of implementation the IComparer interface for int32 and for string, doesn't work the "second variants" (w/o comment will be main error CS0701)
答案在the error message中是正确的:
A type used as a constraint must be an interface, a non-sealed class or a type parameter.
System.String
是密封的 class,而 System.Int32
根本不是 class。这些都不是接口或类型参数。所以两者都不符合约束条件。
更实际地说:密封 classes 和值类型(结构,即 System.Int32
之类的东西)不是有效约束的原因是它们作为约束没有任何意义。约束允许类型参数是继承约束类型的类型。但是 sealed classes 和值类型不能有继承类型。因此,将它们用作约束将提供零收益。在这种情况下,您最好省略类型参数并显式使用该类型。
我正在为我的 class 库存测试 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);
}
}
为什么在实现 int32 和字符串的 IComparer 接口时,"second variants" 不起作用(w/o 注释将是主要错误 CS0701)。 我知道 "second variants"(已评论)从语法的角度来看是不正确的 "Constraints on type parameters (C# Programming Guide)",但我没有看到与上述变体 "where 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);
// }
//}
I have two versions of it realization, will it works the same? (Question 1)
您的两个 IComparer<T>
实现具有完全相同的逻辑,因此从这个意义上讲,它们的工作方式完全相同。唯一的 material 区别是通用版本不仅可以比较 Inventory
的类型,还可以比较 Inventory
的任何子 class。
由于通过泛型接口中的类型参数差异,您可以在使用 Inventory
subclass 的场景中使用非泛型版本,这种差异没有太大的实际意义.您应该能够在完全相同的情况下使用它们。
就你的第二个问题而言:
And why, in cases of implementation the IComparer interface for int32 and for string, doesn't work the "second variants" (w/o comment will be main error CS0701)
答案在the error message中是正确的:
A type used as a constraint must be an interface, a non-sealed class or a type parameter.
System.String
是密封的 class,而 System.Int32
根本不是 class。这些都不是接口或类型参数。所以两者都不符合约束条件。
更实际地说:密封 classes 和值类型(结构,即 System.Int32
之类的东西)不是有效约束的原因是它们作为约束没有任何意义。约束允许类型参数是继承约束类型的类型。但是 sealed classes 和值类型不能有继承类型。因此,将它们用作约束将提供零收益。在这种情况下,您最好省略类型参数并显式使用该类型。