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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Q&A

解決済

2回答

10960閲覧

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

au_mode

総合スコア8

C#

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

0グッド

0クリップ

投稿2018/07/06 03:33

前提・実現したいこと

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#

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

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

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

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

C#

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

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

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

投稿2018/07/06 04:23

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

au_mode

2018/07/06 04:31

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

0

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

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

投稿2018/07/06 04:09

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

au_mode

2018/07/06 04:34

URLを見て動的に作成はできるのだと思いましたが、役に立たないとは本来のEnum型のようにはならないということでしょうか。 ほかの回答者様の意見も踏まえて、Enumを使用することはあきらめようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問