6

这个问题来自这个小奇迹:Comparer<T>.Default 。我想知道作者在该行中写了什么:

如果您要比较的类型已经实现IComparable<T>,或者该类型是System.Nullable<T>T 实现的位置,则System.Collections.Generic 命名空间 IComparable中有一个类,它公开了一个名为 Default 的属性,它将创建一个单例,表示以下项的默认比较器那种。Comparer<T>

例如:

我有一堂课:

class Foo : IComparable<Foo> { ... }
public class FooComparer : IComparer<Foo> { ... }

比较器类实现为public abstract class Comparer<T> : IComparer, IComparer<T>. 我的问题是 Default 属性的整体工作原理,它的作用以及它是如何工作的?

谢谢

4

1 回答 1

8

Comparer<T>.Default不使用您的FooComparer课程。它只是返回内部类的一个实例GenericComparer<T>
此类具有T必须实现的约束,因此它可以简单地将对它的方法IComparable<T>的调用委托给它传递的实例的方法。CompareCompare

像这样的东西:

internal class GenericComparer<T> : Comparer<T> where T : IComparable<T>
{
    public override int Compare(T x, T y)
    {
        if (x != null)
        {
            if (y != null)
                return x.CompareTo(y);
            return 1;
        }
        else
        {
            if (y != null)
                return -1;
            return 0;
        }
    }

    // ...
}
于 2013-02-19T14:52:24.190 回答