非整数列挙型を作成できないのはなぜですか? これが言語設計上の決定なのか、それともコンパイラでの実装に問題があるのかを知りたいです。
言い換えれば、非整数列挙型を言語に実装することは可能ですが、正当な必要性はありませんか? または、それが実現可能ではないが正当化できる場合、どのような障害が妨げになっていますか?
誰かが、これを C# で使用できない理由または理論的根拠を教えてください。かなりお願いします。
非整数列挙型を作成できないのはなぜですか? これが言語設計上の決定なのか、それともコンパイラでの実装に問題があるのかを知りたいです。
言い換えれば、非整数列挙型を言語に実装することは可能ですが、正当な必要性はありませんか? または、それが実現可能ではないが正当化できる場合、どのような障害が妨げになっていますか?
誰かが、これを C# で使用できない理由または理論的根拠を教えてください。かなりお願いします。
実行できない技術的な理由はありませんが、実際には一連の定数について話しています (関連している場合は、おそらく共通の名前空間内にあります)。
列挙型では、数値は一般に二次的なものです。
以下では:
enum Fruit {
Apple,
Orange,
Pear,
Peach
}
名前付き定数のセットのみを記述しています。Fruit 型の変数は、これら 4 つの値のいずれかを取ることができると言っています。それぞれの整数値が何であるかは、実際には関係ありません。名前だけで言及する限り、Apple を表す値が 0、1、32、-53、0.002534f のいずれであっても問題ありません。
ほとんどの言語では、それぞれを表す値を指定できますが、それは実際には二次的なものです。便利な場合もありますが、列挙型の中心的な目的の一部ではありません。これらは、それぞれに整数 ID を指定する必要なく、関連する名前付き定数のセットを提供するためだけに存在します。
さらに、列挙型は、ビット演算と組み合わせることができるオプションのフラグを指定するためによく使用されます。各値が整数で表されている場合、これを実装するのは簡単です (その場合は、必要なビット パターンを使用する整数を選択するだけです)。このコンテキストでは、浮動小数点値は役に立ちません。(ビットごとの and/or 演算は、浮動小数点値ではあまり意味がありません)
あなたがやりたいこととは対照的に、列挙型は意味のある数値表現を保持することを意図していなかったので、列挙型はこのように作られたと思います。
たとえば、列挙型は ff を記述するのに最適です。
enum Color
{
Black,
White,
Red,
Yellow,
Blue,
//everything else in between
}
(確かに、色は複雑な型で数値的に表すことができますが、しばらくの間、私を甘やかしてください)。気分はどうですか?
enum Mood
{
Happy,
Giddy,
Angry,
Depressed,
Sad
}
または味?
enum Taste
{
Bitter,
Salty,
Sweet,
Spicy
}
要点がわかると思います。要するに、列挙は、数値で表現するのが難しい、または意味のあるまたは実用的な数値表現を持たないオブジェクトまたはオブジェクトの特性を表すことを意図していたため、そのような場合に最も便利なデータ型である整数への任意の割り当てです。
これは、数値的に意味のある祝日などとは対照的です。
言語の設計者だけが、非整数列挙を許可しなかった理由を説明できますが、最も可能性の高い説明をお伝えできます。
元の C は、その目的 (システム プログラミング言語) には不要だったため、これを行いませんでした。C++ は C に基づいており、とにかくクラスでエミュレートできるため、これを行いませんでした。C# はおそらく同じ理由でそれを行いません。
私はこれらの言語のいずれの設計にも関与していないため、これは単なる当て推量です。
クラス (DateTime) の方法に進むと決めたら、最後まで行かない理由はほとんどありません。列挙型を使用する場合は、ゼロから始まる連続した整数として列挙型を作成し、それらの列挙型をインデックスとして使用して DateTime 値の配列を作成できます。
しかし、クラス内にキット全体と kaboodle を提供する Holiday クラスがあればよいのです。定数、これらの定数に基づいて DateTime を返す get() ルーチンなどです。
これにより、真のカプセル化と、インターフェイスに影響を与えることなく実装を完全に変更する機能が得られます。なぜ OOP の利点の 1 つを捨ててしまうのでしょうか?
実際の答えを知らなくても、私はそれがより後者であることを提案します - 本当に正当な必要性はありません.
私の考えでは、列挙型は単に特定のケースで利用可能なさまざまなオプションを表すために存在します。実際にデータを保存するわけではありません。
列挙値を保持する変数は、値 1、2、または 3 を保持していると考えるべきではありません。それらがそのメモリ位置に格納されている実際の値であってもです。代わりに、月曜日、火曜日、または水曜日 (たとえば) を表すと考えてください。その列挙に関してのみ意味があり、他の方法で使用するべきではありません (ただし、多くの場合使用します)。Enum 値に対して実行する操作は、Enum が実装されている方法で使用できるプログラミング ショートカットにすぎません。