次のメソッドを書いたとします。
public static T Max<T>(T x, T y) where T : struct, IComparable<T>
{
return (x.CompareTo(y) > 0) ? x : y;
}
これはうまく機能し、2 つの値型の値のうち大きい方を見つけます。これが使用される例を次に示します。
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# 宣言がandenum MyFoo { ... }
を実装する型を与えるようにするのは難しいでしょうか?IComparable<MyFoo>
IEquatable<MyFoo>
(彼らが .NET 2 を導入したとき、彼らは非ジェネリックであってもT[]
実装する魔法を作成しました。私の「要求」はより簡単に思えます (これも非ジェネリックですが、ユーザー定義の列挙型は「実際の」型です)。)IList<T>
System.Array
System.Enum