这些代码将以相同的方式工作(具有基本 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 和值类型不能有继承类型。因此,将它们用作约束将提供零收益。在这种情况下,您最好省略类型参数并显式使用该类型。