我有一个类(Foo),用于比较T类型的对象,但是T可能并不总是实现IComparable,并且构造函数应该能够与空的comparer参数一起使用。为了在创建Foo时发现这一点,我尝试了以下操作:

public sealed class Foo<T>
{

    private readonly IComparer<T> _comparer;

    public Foo(IComparer<T> comparer)
    {
        _comparer = comparer ?? Comparer<T>.Default;
        if (_comparer == null)
            throw new NotSupportedException("A comparer was not passed for T and no default was found for T. ");

    }
}


我假设(错误地)如果对象未实现Comparer<T>.Default的情况下IComparable<T>为null,但Default仍将返回有效的Comparer,当调用compare且我尚未能够通过研究如何解决这种情况找到解决方案。

我应该如何处理这种情况?

编辑:澄清此类应能够使用给定的比较器对T类型的对象进行排序。但是T可能并不总是具有IComparable,但是当提供一个Comparer时,它仍然应该能够对那些对象进行排序,约束会破坏该要求。但是,如果在Comparer中传递的值为null,则它应尝试使用ArgumentsException。如果该对象是IComparable,则一切正常,否则应抛出Default

最佳答案

根据您更新的问题,请给出新的答案。

public Foo(IComparer<T> comparer)
{
    _comparer = comparer ??
                     typeof(IComparable<T>).IsAssignableFrom(typeof(T))
                     ? Comparer<T>.Default : null;
    if (_comparer == null)
        throw new NotSupportedException("A comparer was not passed for T and no default was found for T. ");

}


我怎么不喜欢线性解决方案。以下外观更干净的IMO

public Foo(IComparer<T> comparer)
{
    if(comparer == null)
    {
        if(typeof(IComparable<T>).IsAssignableFrom(typeof(T))
        {
             comparer = Comparer<T>.Default;
        }
        else
             throw new NotSupportedException("A comparer was not passed for T and no default was found for T. ");
    }

    _comparer = comparer;


}

关于c# - 确保使用了有效的IComparer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41757210/

10-13 06:24