假设我写了以下方法:
public static T Max<T>(T x, T y) where T : struct, IComparable<T>
{
return (x.CompareTo(y) > 0) ? x : y;
}
这很有效,可以找到两个值类型值中较大的一个。这是一个使用它的例子:
void Test(DateTime oneTime, DateTime anotherTime)
{
var latestTime = Max(oneTime, anotherTime);
...
}
但上述方法不适用于枚举。Max(DayOfWeek.Thursday, DayOfWeek.Friday)
因此,由于约束(编译器:),例如将无法工作"There is no boxing conversion from 'System.DayOfWeek' to 'System.IComparable<System.DayOfWeek>'."
。
当然也有变通办法。我可以使约束引用非通用接口,但这将涉及在调用中对to进行装箱。谁喜欢非通用 .NET 1 接口?y
System.Object
CompareTo
DayOfWeek
确实实现了非泛型接口IComparable
(通过System.Enum
任何枚举类型的基类),但遗憾DayOfWeek
的是没有实现IComparable<DayOfWeek>
.
所以我的问题是:改变这种情况(在未来的 .NET 版本中)是否很难让 C# 声明像这样enum MyFoo { ... }
给出一个实现IComparable<MyFoo>
和的类型IEquatable<MyFoo>
?
(当他们引入 .NET 2 时,即使是非泛型的,他们也能拥有一个T[]
实现。我的“请求”似乎更容易(也是非泛型的,但用户定义的枚举是“真正的”类型)。)IList<T>
System.Array
System.Enum