質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C#

    7116questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Enum型の変数を動的にしたい。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 219

au_mode

score 2

 前提・実現したいこと

Enum型の要素に変数代入したいのですが
「静的でないフィールド、メソッド、またはプロパティ 'xxx' で、オブジェクト参照が必要です」
とエラーが出たのですが、動的な変数を代入することはできないのでしょうか?
可能であれば方法をご教授いただきたいです。

もしくは、自由に要素を追加できればそれでも問題ないのですが、調べても理解ができませんでした。

以下参考URL
https://qiita.com/tanoshim-shimpeiminato/items/368b46c4b8bf2624fa00
https://ja.stackoverflow.com/questions/10078/%E5%80%A4%E3%81%AE%E8%BF%BD%E5%8A%A0%E5%A4%89%E6%9B%B4%E3%81%AB%E6%9F%94%E8%BB%9F%E3%81%AAenum%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
https://qiita.com/mikuri8/items/6198cc6adf6b19480873

 例

   private int NUM1;
   private int NUM2;
   private int NUM3;

      public void Set1()
        {
           NUM1 = 6;
           NUM2 = 5;
           NUM3 = 4;
        }

      public void Set2()
        {
           NUM1 = 4;
           NUM2 = 5;
           NUM3 = 6;
        }

      public enum Test: int
        {
           A = 1,
           B,
           C
           //ここにD,E,Fを追加したい、もしくは変数を代入したい
           //D = NUM1,
           //E = NUM2,
           //F = NUM3,
        }

 補足情報(FW/ツールのバージョンなど)

VisualStudio2017
C#

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

こんにちは。

私の知る限りC#はその機能に対応していません。(C#はかなりアグレッシブな言語なので知らないうちに拡張されることは良くありますが。)

しかし、ご存知のようにenum型は、それなしにはプログラムを開発できないというものではありません。int型でも代用できますから。でも、int型は値の範囲をユーザが限定することができませんので、間違って不正な値を代入しても処理系が検出できません。それを補完する仕組みがenum型です。

enum型に設定できる値はコンパイル時に決定している言語がほとんどと思います。
もしも、設定できる値の範囲を動的に変更できるようにすると、設定範囲変更前に設定していた値の扱いが難しいです。もしも動的変更ができた場合、以下のようなプログラムの正しい振る舞いはなんでしょう?

Test.set1();
Test test=Test::D;  // testの値は6の筈
Test.set2();        // testの値は6のまま? それとも4へ変わるべき?
Console.WriteLine(test);

更にset3()がNUM1,NUM2,NUM3のどこにも6を設定しなかった場合や、NUM1=1;NUM2=1;NUM3=1;なんてした場合などにどのように振る舞うべきが決定できないと思います。

いつかこれらの問題について、多くのプログラマーが賛同する振る舞いが見つかった暁には動的に値の反映を変更できるようなenum型が発明されるかも知れません。それまでは現状の静的に範囲を限定して使うのが妥当だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/06 13:31

    ご返答ありがとうございます。
    動的にしたければEnumを使用する必要はないですよね....

    詳細に説明いただきありがとうございます。

    キャンセル

0

こんにちは。
enum型の持つ値はコンパイル時に定まっている必要があるので、動的な変更を行うことはできません。
質問のコードでは、代入している変数をconst intで宣言するとenum定義に使用できますが、当然変更を加えることはできません。
根本的にenumの使い方を間違えていると思われます。

リフレクションをガリガリ使って無理やり動的enumを作ることはできますが、それはenumとして全く役に立たないので意味がないと思います。(参考urlの1のことです)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/06 13:34

    URLを見て動的に作成はできるのだと思いましたが、役に立たないとは本来のEnum型のようにはならないということでしょうか。

    ほかの回答者様の意見も踏まえて、Enumを使用することはあきらめようと思います。

    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7116questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。