2

引数として整数を取る関数があるとします。整数値を整理する方法として、列挙リストを使用できるようにしたいと考えています。

たとえば、理想的には、これら (疑似コード) を定義できるようにしたいと考えています。

public enum days
{
    monday,
    tuesday,
    etc...
}

public enum months
{
    january,
    february,
    etc...
}

int doSomething(enum x)
{
    return x + 1;
}

次に、次のように列挙されたリストのいずれかを使用して関数を呼び出すことができます。

int a = doSomething(days.monday);
int y = doSomething(months.february);

doSomething は、列挙型の 1 つだけ (すなわち、日または月) を使用して定義する必要があるため、これは明らかにそのままでは機能しません。私はいくつかのオプションを知っています。1 つは単純に int にキャストする方法です。

int a = doSomething((int)days.monday);
int y = doSomething((int)months.february);

これに関する唯一の問題は、この関数がコード内の多くの場所で呼び出されることであり、"(int)" をあちこちに配置しなければならないのは不器用です (これらの int 値を列挙型にグループ化する主な動機の 1 つです)。最初の場所は、コードをより読みやすくすることです)。

別のオプションは、列挙型を完全に回避し、代わりに値を次のようなコンテナ クラスにバンドルすることです。

static class Days
{
    static int x = 0;

    static int monday = x++;
    static int tuesday = x++;
}

繰り返しますが、これは機能しますが、これらのコンテナー クラスを定義する必要がある場合は、非常に面倒に思えます。

答えは、これ以上簡単な方法はなく、大人になってこれらのオプションの 1 つを受け入れる必要があるということかもしれません。しかし、私はそれにコミットする前に、それについて健全性チェックを受けると思っていました。3番目のオプションはありますか?

4

8 に答える 8

2

あなたの問題は何ですか?

public enum Days : short
{
    Monday = 1,
    Tuesday = 2,
    ...
}

DoSomething(Days.Monday);

void DoSomething(Days day)
{
    Days nextDay = day + 1;
}

また、すでに組み込まれている enum System.DayOfWeek にも注意してください。


OPの要点はわかりましたが、これはC#ではまだサポートされていません。

void DoSomething<T>(T e) where T : enum
{
    T next  = e + 1;
}
于 2012-09-14T16:37:12.963 に答える
0

同じ問題(解決策)が得られたため、これに「少し」の時間を費やしました。したがって、(.NET 4)、Windowsフォームで正常に機能する私のソリューションは次のとおりです。

VB:NET

           Private Function DoSomething(Of TEnum As {IComparable, IConvertible, IFormattable})(ByVal valueEnum As TEnum) As Int32

              Dim i As Int32 = CInt(Convert.ChangeType(valueEnum, valueEnum.GetTypeCode()))
              //Do something with int
              i += 1
              Return i

           End Function

    C#

        private int DoSomething<TEnum>(TEnum valueEnum) where TEnum: IComparable, IConvertible, IFormattable 
                    {
                        int i = 0;
                        i = (int)Convert.ChangeType(valueEnum, valueEnum.GetTypeCode());
                        i++;
                        return i;
                    }
于 2012-09-19T11:44:27.347 に答える
0

パラメータで関数をオーバーロードしようとしました:

int DoSomething(Enum1 value)
int DoSomething(Enum2 value)
于 2012-09-14T17:16:52.627 に答える
0

または、既存の列挙型をすべて変更したくない場合:

    public static int DoSomething(Enum x) 
    {
        int xInt = (int)Convert.ChangeType(x, x.GetTypeCode());
        DoSomething(xInt);
    }

ここに記載されているように:enums-returning-int-value

于 2012-09-14T16:58:17.827 に答える
0
public enum days : int 
{ monday, tuesday,

}

public enum months :int
{ january, february, march,

}

public  int doSomething(int z)
{
  return z + 1;
}

// 呼び出しメソッド int c = ee.doSomething((int)testenums.months.march); int c = ee.doSomething((int)testenums.day.February);

常に列挙型を渡し、int型であるため、このコードを解析して送信するだけで完全に機能する作業コード..教えてください

于 2012-09-14T17:18:55.333 に答える
0

はい、できます

public enum days : int
{
    monday,
    tuesday,
    ...
}

自動的に月曜日が 0 になり、火曜日が 1 になります。

public enum months : int
{
    january,
    february,
    ...
}

何ヶ月も同じ

int doSomething(Enum x)
{
    return (int)x + 1;
}

そしてそれを次のように呼び出します

int a = doSomething(days.monday);

またはそれを次のように呼び出します

int a = doSomething(months.january);

now days.monday equals 0and after メソッドaは 1 になります。

于 2012-09-14T16:37:15.927 に答える
0

に問題はありSystem.DateTimeますか?

これは、使用するのに最も実用的なタイプです。

于 2012-09-14T16:37:24.777 に答える
0

本当に int 値だけが必要な場合は、メソッドをオーバーロードできますが、おそらく次のようなものでしょうか?

int dosomething(enum x)
{return dosomething((int)x)}
int dosomething(int x)
{return x+1}
于 2012-09-14T16:47:38.757 に答える