C#
1public class AllyMemberStatus : MonoBehaviour 2{ 3 public static string charactorName = " "; 4 public static string charactorID = " "; 5}
上記のクラスAllyMemberStatusのcharactorIDを「一意なIDを作成してそのIDを」保存したい。
C#
1 private System.Guid guid = System.Guid.NewGuid(); 2 private string uuid = guid.ToString();
調べるとGuidで一意なIDは作成できそう。
しかし、上記コードでは下記のエラー
Assets\Resources\AllyStatus\AllyMemberStatus.cs(9,40): error CS0236: A field initializer cannot reference the non-static field, method, or property 'AllyMemberStatus.CharactorID'
ゲーム内部のキャラクターIDを管理するとき、Guidではなく皆様自作でやっておられるのでしょうか?それとも、Guidの使い方が間違ってますでしょうか。教えてください。
まずエラーを読むところから始めますね。
runする以前にエディタで怒られてます。
AllyMemberStatus.guid参照できません。となります。
privateなメンバーを外からアクセスしようとしているからではないでしょうか。
ならないでしょう。いい加減な読み方ではなく、ちゃんと読んでください。
>BluOxy様
public string CharactorID = System.Guid.NewGuid().ToString("N");
public static string charactorID = CharactorID;
試行錯誤して上記コードに変更すると、今度はAllyMemberStatus.CharactorIDを参照できませんとなります。Guid自体はPublicだったと思うのでどこかでプライベートになってしまってるのでしょうか、、、
質問している間にコードがコロコロ変わったのでは切り分けすらできません。コードを書き換える前にどのコードでどのエラーメッセージが出たのかを調べ、「きちんと」読んでください。
質問のコードではそのようなエラーが出るはずはありません。意訳は不要です。そのまま読んでください。
その前に問題を正確に精査していただきたいです。
> AllyMemberStatus.guid参照できません。となります。
具体的に何のエラーコードを返したのでしょうか。質問は編集できるので、質問に記載してください。
> AllyMemberStatus.CharactorIDを参照できません
それではアクセスできません。問題に気づくには、エラー内容を読んでからです。
また、このエラーが分からないとなると、C#の基礎を理解していないように見受けられます。
> Guid自体はPublicだったと思うのでどこかでプライベートになってしまってる
その根拠はなんでしょうか。
間違っていても良いです。ただ、もし根拠がない推測であれば、考えが誤った方向にしかいかないので、やめたほうがいいです。
Assets\Resources\AllyStatus\AllyMemberStatus.cs(9,40): error CS0236: A field initializer cannot reference the non-static field, method, or property 'AllyMemberStatus.CharactorID'
ほかのスクリプトも編集中でしたので(ほかのスクリプトも直し途中でエラー)それを整理してrunしました。上記のエラーです。
ほら全然違う。
https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0236
ここを読んでください。解決法が書いてあります。
staticではないフィールドだから見つからなかったんですね。
staticを付けたらエラーではなくなりました。
しかし、上記の場合なぜstaticが必要であったのかがわかりません。
ZuishinさんのURL読んでみます。
まず、staticの意味を理解して使っているでしょうか。
そうでなければ、staticが必要かどうかは分からないに決まっています。
分からないことを放置してコードを書くと今回のように躓くリスクが発生するので、C#の基礎を習得した方が良いです。
そして、仮に今回のようなことで躓いたときは、**事象** を正確に把握してください。
具体的にはエラーの内容を理解することです。
今回のケースでは、Zuishin さんの貼った公式のドキュメントに書いてある CS0236 エラーの情報を読んで、MOTOMUR さん自身で事象が起きたか確かめてください。
その事前調査を行えば、大抵の場合は自己解決します。
それでも今回の問題が解決しなければ、どこが問題なのか、改めて記載してください。
※解決したならご自身の回答をBAに選択してクローズしてもらえればと思います
staticなしの宣言だとインスタンスフィールドになってしまうんですね。インスタンスフィールドだとメソッド外部でインスタンスフィールド同士で初期化できない(代入側がインスタンスフィールドだとだめ)。
インスタンスフィールドを使いたいならメソッドかクラスコンストラクター内で初期化、外で初期化したいならstaticフィールドを使えばよかったということで、間違いないでしょうか。
間違いがなければ自身BAでクローズします。
また、C#基礎についてはさらっと読んで覚えたつもりですが、実際使用してみると混乱してしまいます。なるべくご迷惑をおかけせずに学習していきたいと思います。
> staticなしの宣言だとインスタンスフィールドになってしまう
はい。なってしまうというより、それが一般的なC#のコードです。
staticはオブジェクト指向であるメリットを失うので、理由がない限り多用すべきではありません。
> インスタンスフィールドだとメソッド外部でインスタンスフィールド同士で初期化できない
すみません。「インスタンスフィールド同士で初期化」の意味が分かりませんでした。
> インスタンスフィールドを使いたいならメソッドかクラスコンストラクター内で初期化
publicなフィールドなら外からでも変更できます。
> 外で初期化したいならstaticフィールドを使えばよかった
何か違うと思います。下記がポイントです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/static
> static 修飾子は、静的メンバーの宣言に使用します。静的メンバーは、特定のオブジェクトではなく、型自体に属するメンバーです。
「例 - 静的フィールドとメソッド」を読んでみて、staticなメンバーと非staticなメンバーの値の状態と、アクセス方法の違いを確認してください。
原因はこれです。
> フィールド初期化子は、静的でないフィールド、メソッド、またはプロパティ 'field' を参照できません
静的でないフィールド、静的でないメソッド、静的でないプロパティを、フィールド初期化子で使うことはできません。
そして解決法はこれです。
> クラス コンストラクター内で初期化を実行することをご検討ください。
回答1件
あなたの回答
tips
プレビュー