我有一个类(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/