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

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

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

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

Q&A

解決済

4回答

1664閲覧

クラス変数内のIListに追加

taopaipai

総合スコア17

C#

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

0グッド

0クリップ

投稿2020/10/11 04:13

前提・実現したいこと

クラス変数内のIListに追加をしていきたいのですが、
ソースコードの 「Startup」 の 「wk.XX.Add(wwkk);」の行 で
が発生してしまいます。
( xGTOをnewしている 変数 wk の XCDの値は「1」、XXの値は「null」でした。)
wk の XXのIListに リストの追加と値を設定できる方法を教えてください。

発生している問題・エラーメッセージ

「System.NullReferenceException: 'Object reference not set to an instance of an object.'
TESTPro.Startup.xGTO.XX.get が null を返しました。」

該当のソースコード

C#

1 2public class xGTO 3 { 4 public string XCD { get; set; } 5 public IList<xxGTO> XX { get; set; } 6 } 7 8 public class xxGTO 9 { 10 public string XXCD { get; set; } 11 } 12 13 public void Start() 14 { 15 16 xGTO wk = new xGTO(); 17 wk.XCD = "1"; 18 19 xxGTO wwkk = new xxGTO(); 20 wwkk.XXCD = "2"; 21 wk.XX.Add(wwkk); 22 } 23

試したこと

CASTしたりしたがエラーは変わらず

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

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

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

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

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

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

Automatic9045

2020/10/11 04:28

xGTO.XXプロパティをList型ではなくIList型(インターフェイス)にしている理由は何かありますか? それによって回答が変わってくるので、返信の程よろしくお願いします。
taopaipai

2020/10/11 04:34

IListにしているのは詳しくは不明なのですが速度的な面の考慮だと思われます。 IListと決まっているため IListでの話で教えていただきたいです。
taopaipai

2020/10/11 08:20

了解しました。
guest

回答4

0

IListになっている理由があるとのことでしたので、改めて回答します。

以下のように記述することで、IList型のプロパティにList型のインスタンスを代入することは出来ます。

C#

1public IList<xxGTO> XX { get; set; } = new List<xxGTO>();

IListになっている意味がよく分からないので、ここまでしか回答は出来ません。
もしかしたら今後予期せぬ例外などが発生することがあるかもしれないので、発生したときにまた改めて質問してみて下さい。

投稿2020/10/11 05:48

Automatic9045

総合スコア313

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

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

taopaipai

2020/10/11 08:15

了解しました。
guest

0

ベストアンサー

xGTO クラスの定義に以下のようなコンストラクタを追加してはいかがですか?

イメージ説明

そうすれば同じコードで少なくともエラーにはなりません。

イメージ説明

投稿2020/10/11 05:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

taopaipai

2020/10/11 05:51

ありがとうございます。
guest

0

こんにちは。

IList型になっている特段な理由は無いものとして回答します。
ただリストを作りたいだけの場合は、List型にするのが一般的です。

ListにAddするためには、まずはじめにListのインスタンスを作成しておく必要があります。
xGTOクラスを初期化する時にListのインスタンスを作成する形にすると良いでしょう。

C#

1public List<xxGTO> XX { get; set; } = new List<xxGTO>();

投稿2020/10/11 04:31

Automatic9045

総合スコア313

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

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

taopaipai

2020/10/11 04:39

リストの場合は以下のように書くことで追加できることは確認しました。 IListでは無理なのでしょうか? xGTO wk = new xGTO{ XCD = "1", XX = new List<xxGTO> { new xxGTO { XXCD = "2" }, new xxGTO { XXCD = "3" }, new xxGTO { XXCD = "4" } }
Automatic9045

2020/10/11 04:42

外部のライブラリで提供されているインターフェイスを実装していたり、あるいは抽象クラスをオーバーライドしている関係でIListにする必要がある…という感じですか?
taopaipai

2020/10/11 04:46

Listの要素の中にさらに要素と別のListがあり、それが膨れていく形で決まっているのです。 なぜそうなっているのかは理由は不明なのです。
Automatic9045

2020/10/11 04:51

その要件ではIList型にする必要性は無さそうに見えますが…… データ構造をもう少し詳しく質問文に追記して頂けますか?
taopaipai

2020/10/11 05:00

以下のように要素とIListがあり、XX、YY、ZZ の中に要素とさらにIListがあり、その中で設定しているIListにもさらに要素とIListがある形で(IList内にIList内にIList内にIList内にIList)となっています。 なぜこういう構造になっているのか理由が不明なのです。 public class xGTO { public string XCD { get; set; } public IList<xxGTO> XX { get; set; } public IList<xxGTO> YY { get; set; } public IList<xxGTO> ZZ { get; set; } }
Automatic9045

2020/10/11 05:41

木構造になっているようですね。 これだけではIListである必要は特にありませんが、その他の何らかの理由でIListにしなければならないものとして回答します。
taopaipai

2020/10/11 06:01

訂正します。 こうでした。 public class xGTO { public string XCD { get; set; } public IList<xxGTO> XX { get; set; } public IList<yyGTO> YY { get; set; } public IList<zzGTO> ZZ { get; set; } }
guest

0

XXで返すべきListのインスタンスを作成していないようです。
また、プロパティとして公開する型はIList<xxGTO>でいいのですか?List<xxGTO>でもいいような感じに見えます。

投稿2020/10/11 04:27

編集2020/10/11 04:49
YAmaGNZ

総合スコア10469

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

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

taopaipai

2020/10/11 04:40

ILst<xxGTO> として決まっていて変更できないのです。 そのためILst<xxGTO>での書き方を教えてもらえるとありがたいです。
YAmaGNZ

2020/10/11 04:48

IList<xxGTO>として公開するということは、IList<xxGTO>インターフェイスを実装しているものであればいいと取れるので、中身はList<xxGTO>でいいのではないでしょうか
taopaipai

2020/10/11 04:52

Listでしか書けないのでしょうか? 悩んでしまって先に進めないのです。
YAmaGNZ

2020/10/11 04:58

IListはあくまでインターフェイスでこれをインスタンス化することはできません。 public IList<xxGTO> XX { get; set; } という書き方ですと、IList<xxGTO>インターフェイスが実装されていると明記されている状態です。 なので、IList<xxGTO>を実装しているものとなるとList<xxGTO>とするのが一番素直な実装になると思います。 なので public IList<xxGTO> XX { get; set; } = new List<xxGTO>(); とすればいいのではないでしょうか。
taopaipai

2020/10/11 05:06

動作して確認してみます
taopaipai

2020/10/11 05:17

public IList<xxGTO> YY { get; set; } = new List<xxGTO>(); を宣言して xxGTO YY = new xxGTO(); YY.XXCD = "2"; wk.YY.Add(wwkk); とした際にぬるぽで怒られてしまいます。
YAmaGNZ

2020/10/11 05:44

YYはどのYYなのですか? 提示された部分だけでYYが2つあり、正しく設定されているのか不明です。 今までXXというプロパティの話だったのに突然YYというものを出されても困ります。 変に省略しないで、該当の全ソースを提示できませんか?
taopaipai

2020/10/11 05:50

要素がかなりあり、IListのクラスも複数あって深く、書ききれないです。
taopaipai

2020/10/11 06:03 編集

2段目までで簡略するとこうなります。 public class xGTO { public string XCD { get; set; } public IList<xxGTO> XX { get; set; } public IList<yyGTO> YY { get; set; } public IList<zzGTO> ZZ { get; set; } }
YAmaGNZ

2020/10/11 07:43

何段階とか知りませんが、適切なところで初期化できていないのでNullReferenceExceptionとなるということです。 public class xGTO { public string XCD { get; set; } public IList<xxGTO> XX { get; set; } = new List<xxGTO>(); public IList<yyGTO> YY { get; set; } = new List<yyGTO>(); public IList<zzGTO> ZZ { get; set; } = new List<zzGTO>(); } とすれば xGTO x = new xGTO(); x.XCD = "1"; x.XX.Add(new xxGTO()); x.YY.Add(new yyGTO()); x.ZZ.Add(new zzGTO()); このように書いてもNullReferenceExceptionは発生しません。 なので、余計なこと、足りないこと、勘違いなどがある可能性があるのでソースを提示してくださいと書きました。
taopaipai

2020/10/11 07:54

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問