7

假设我写了以下方法:

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 接口?ySystem.ObjectCompareTo

DayOfWeek 确实实现了非泛型接口IComparable(通过System.Enum任何枚举类型的基类),但遗憾DayOfWeek的是没有实现IComparable<DayOfWeek>.

所以我的问题是:改变这种情况(在未来的 .NET 版本中)是否很难让 C# 声明像这样enum MyFoo { ... }给出一个实现IComparable<MyFoo>和的类型IEquatable<MyFoo>

(当他们引入 .NET 2 时,即使是非泛型的,他们也能拥有一个T[]实现。我的“请求”似乎更容易(也是非泛型的,但用户定义的枚举是“真正的”类型)。)IList<T>System.ArraySystem.Enum

4

0 回答 0