将这些代码工作相同(具有基类约束的通用类与非泛型类“对应”)

问题描述 投票:1回答:1

我正在为我的班级库测试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);
//    }
//}
c# generics interface implementation
1个回答
0
投票

我有两个版本的实现,它会一样吗? (问题1)

你的两个IComparer<T>实现具有完全相同的逻辑,因此从这个意义上说它们将完全相同。唯一的不同之处在于,通用版本不仅可以用于比较Inventory的类型,还可以用于Inventory的任何子类。

由于通用接口中的via类型参数方差,您可以将非泛型版本与使用Inventory子类的场景一起使用,这种差异没有太大的实际意义。您应该能够在完全相同的情况下使用它们。

至于你的第二个问题:

为什么,在实现IC32arer接口的int32和字符串,不起作用的“第二个变种”(没有评论将是主要错误CS0701)

答案就在the error message

用作约束的类型必须是接口,非密封类或类型参数。

System.String是一个密封的类,System.Int32根本不是一个类。它们都不是接口或类型参数。因此,两者都不能作为约束。

更实际地说:密封类和值类型(结构,即像System.Int32这样的东西)不是有效约束的原因是它们作为约束没有任何意义。约束允许type参数是继承约束类型的类型。但是密封类和值类型不能具有继承类型。因此,使用它们作为约束将提供零利益。在这种情况下,您也可以省略type参数并明确使用该类型。

© www.soinside.com 2019 - 2024. All rights reserved.