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

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

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

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

Q&A

2回答

1132閲覧

C#でのSturct要素の取得

seri

総合スコア422

C#

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

0グッド

0クリップ

投稿2017/02/27 09:25

public static class StatusManager { ・・・ public struct Status { public static float[,] _Sex; public static float[,] _Hp,_At,_Df,_Sp,_Lv; } ・・・

上のようなStructがあるとしまして。
これらの値を取得する関数を作ったのですが参照渡しになっておりません。

・・・ public static float[,] GetStatusChild(int i) { switch (i) { case 1: return Status._Sex; case 2: return Status._Hp; case 3: return Status._At; case 4: return Status._Df; case 5: return Status._Sp; case 6: return Status._Lv; default:return null; } } ・・・

理想としてはこのGetStatusChild関数で取得した値をNewで宣言したいのですが以下ではエラーとなります。

GetStatusChild(1);=new float[10, 10]; //エラー CS0131 代入式の左辺には変数、プロパティ、またはインデクサーを指定してください。

エラーを起こさずに値を変更するにはどのように実装すればいいのでしょうか?

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

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

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

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

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

guest

回答2

0

こんにちは。

一応参照を戻り値として返したいというのは、次バージョンのC#7で搭載される新機能「ref returns」によって実現できます。

csharp

1void Method() 2{ 3 GetStatusChild(1) = new float[10, 10]; 4} 5 6public static ref float[,] GetStatusChild(int i) 7{ 8 switch (i) 9 { 10 case 1: return ref Status._Sex; 11 case 2: return ref Status._Hp; 12 // ...

ですが、staticメンバに対してわざわざ数字でアクセスするように書く理由が謎だったり、このような初期化の書き方はそもそもC#でやるようなコードじゃないですし、struct要素の取得と言っておきながら実際はstaticメンバしか配置していなかったりと、色々突っ込みどころがあります。
もうちょっと「そのコードで何を実現したかったのか」が質問に書かれていれば、もっと内容のある回答が書けると思います。

投稿2017/02/27 09:49

tamoto

総合スコア4105

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

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

0

根本的にアプローチが間違っている気がします。きっとこういうことがやりたかったんじゃないですか?

C#

1enum PropertyName 2{ 3 SEX, HP, AT, DF, SP, LV 4}; 5 6class Status 7{ 8 public Status(float sex, float hp, float at, float df, float sp, float lv) 9 { 10 properties.AddRange(new float[] { sex, hp, at, df, sp, lv }); 11 } 12 13 public float this[PropertyName index] 14 { 15 get 16 { 17 return properties[(int)index]; 18 } 19 set 20 { 21 properties[(int)index] = value; 22 } 23 } 24 25 private List<float> properties = new List<float>(); 26 27 public float Sex 28 { 29 get { return this[PropertyName.SEX]; } 30 set { this[PropertyName.SEX] = value; } 31 } 32 33 public float Hp 34 { 35 get { return this[PropertyName.HP]; } 36 set { this[PropertyName.HP] = value; } 37 } 38 39 public float At 40 { 41 get { return this[PropertyName.AT]; } 42 set { this[PropertyName.AT] = value; } 43 } 44 45 public float Df 46 { 47 get { return this[PropertyName.DF]; } 48 set { this[PropertyName.DF] = value; } 49 } 50 51 public float Sp 52 { 53 get { return this[PropertyName.SP]; } 54 set { this[PropertyName.SP] = value; } 55 } 56 57 public float Lv 58 { 59 get { return this[PropertyName.LV]; } 60 set { this[PropertyName.LV] = value; } 61 } 62} 63 64public static void Main() 65{ 66 Status[,] statuses = new Status[10, 10]; 67 statuses[1, 1] = new Status(1, 2, 3, 4, 5, 6); 68 Console.WriteLine(string.Format("[1, 1] の At は {0} です。全部見てみます。", statuses[1, 1].At)); 69 foreach (var p in Enum.GetValues(typeof(PropertyName))) 70 { 71 Console.WriteLine(string.Format("[1, 1] の {0} は {1} です。", Enum.GetName(typeof(PropertyName), p), statuses[1, 1][(PropertyName)p])); 72 } 73}

出力

[1, 1] の At は 3 です。全部見てみます。 [1, 1] の SEX は 1 です。 [1, 1] の HP は 2 です。 [1, 1] の AT は 3 です。 [1, 1] の DF は 4 です。 [1, 1] の SP は 5 です。 [1, 1] の LV は 6 です。

投稿2017/02/27 10:34

Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問