Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带界面约束的通用方法与带界面参数的方法的区别_C#_Generics - Fatal编程技术网

C# 带界面约束的通用方法与带界面参数的方法的区别

C# 带界面约束的通用方法与带界面参数的方法的区别,c#,generics,C#,Generics,有人能解释一下两者之间的区别吗 public void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable { T temp; if (lhs.CompareTo(rhs) > 0) { temp = lhs; lhs = rhs; rhs = temp;

有人能解释一下两者之间的区别吗

    public void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable
    {
        T temp;
        if (lhs.CompareTo(rhs) > 0)
        {
            temp = lhs;
            lhs = rhs;
            rhs = temp;
        }
    }

在我看来,只要您将泛型方法约束为仅接受实现接口的参数,您就可以使用接口类型的参数。

泛型形式将允许编译器进行类型检查,以确保参数的类型相同

以前:
不是从IComparable派生的。因此,实现IComparable的对象不必实现IComparable。这些参数彼此不兼容。

您的第二个参数允许意外使用两种不同类型的参数。这也会导致不必要的装箱。您是对的,谢谢。实际上,在调用CompareToobject时,您的第一个装箱也会导致rhs参数不必要的装箱。您可以通过将约束更改为where T:IComparable来避免它。没错,我从另一个站点复制粘贴了它,但没有注意到。我已经编辑了这个问题。事实上,在测试时,如果第二个参数的类型也不相同,编译器会给出错误。@Tralli这两个方法都存在吗?我相信编译器会选择最适合的,泛型也会选择最适合的。
    public void SwapIfGreater(ref System.IComparable lhs, ref System.IComparable rhs)
    {
        System.IComparable temp;
        if (lhs.CompareTo(rhs) > 0)
        {
            temp = lhs;
            lhs = rhs;
            rhs = temp;
        }
    }