7

次のメソッドを書いたとします。

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 インターフェイスが好きな人はいますか?ySystem.ObjectCompareTo

DayOfWeek 非ジェネリック インターフェイスIComparableを (任意の列挙型の基本クラスSystem.Enumを介して) 実装しますが、残念ながらDayOfWeekを実装しませんIComparable<DayOfWeek>

私の質問は次のとおりです。(将来の .NET リリースで) この状況を変更して、のような C# 宣言がandenum MyFoo { ... }を実装する型を与えるようにするのは難しいでしょうか?IComparable<MyFoo>IEquatable<MyFoo>

(彼らが .NET 2 を導入したとき、彼らは非ジェネリックであってもT[]実装する魔法を作成しました。私の「要求」はより簡単に思えます (これも非ジェネリックですが、ユーザー定義の列挙型は「実際の」型です)。)IList<T>System.ArraySystem.Enum

4

0 に答える 0