比较器<T>.默认属性

M3t*_*0it 5 c#

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

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

例如:

我有一堂课:

class Foo : IComparable<Foo> { ... }
public class FooComparer : IComparer<Foo> { ... }
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Dan*_*rth 7

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

像这样的东西:

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;
        }
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 啊哈,错过了,干杯。我刚刚看到“extern”电话并惊慌失措。 (2认同)