C# 为什么';t IEnumerable<;T>;。最大约束T是i可比较的吗?
如果对C# 为什么';t IEnumerable<;T>;。最大约束T是i可比较的吗?,c#,linq,generics,C#,Linq,Generics,如果对IEnumerable调用.Max()扩展方法,并且其中的对象未实现IComparable,则会得到System.ArgumentException:至少一个对象必须实现IComparable。 为什么Max和类似的方法不约束t来实现IComparable,这样这个问题就可以在编译时而不是在运行时发现呢?我想是因为它更灵活。例如,您可能有一个IEnumerable,它恰好包含字符串,在这种情况下,可以非常安全地在其上调用Max(),尽管类型对象未实现IComparable比较是。。。有趣。
IEnumerable
调用.Max()
扩展方法,并且其中的对象未实现IComparable
,则会得到System.ArgumentException:至少一个对象必须实现IComparable。
为什么
Max
和类似的方法不约束t
来实现IComparable
,这样这个问题就可以在编译时而不是在运行时发现呢?我想是因为它更灵活。例如,您可能有一个IEnumerable
,它恰好包含字符串,在这种情况下,可以非常安全地在其上调用Max()
,尽管类型对象
未实现IComparable比较是。。。有趣。首先,您可以选择IComparable
或IComparable
——您会选择哪个?目前(通过Comparer.Default
)它支持这两种方法,但不存在“this或that”通用约束
然后你得到了Nullable
的问题;这“提升”了比较,因此是否具有可比性取决于T
;但是同样,Comparer.Default
为我们处理这个问题(Nullable
既不实现IComparable
也不实现IComparable
)
加;它节省了一般约束传播的时间;一旦库代码中存在这样的约束,它就会迅速感染所有上游调用代码,这是一个艰难的过程。在写问题时,我想到了一个答案,但仍然认为值得一问。一个有见地的答案。目前我的+1,我不会接受,因为我不想阻止其他答案。许多设计问题的一个困难方面是决定如何平衡健壮系统的痛苦和繁重的需求,以及灵活系统在运行时可能失败的痛苦。在这种特殊情况下,设计师选择了灵活性而不是健壮性;这是否是正确的选择当然是有争议的,但必须做出一些选择,两个选择都不是完美的。@Eric:+1,但我希望你已经发布了一个答案,以便我可以接受它。