2012-02-21 10 views
1

私が主張している例外を投げ、私のASP.NET MVC3プロジェクトのいくつかのC#のコードを持っている:変数に値があるときに「null参照」が報告されるのはなぜですか?

Cannot perform runtime binding on a null reference 

例外をスローするコード行は次のとおりです。

ViewBag.Foo[i].Name = allSpark[i].Users.Name; 

これは、コードブロックです:

ViewBag.Foo = new myAllSparkModelType[allSpark.Length]; 
for (int i = 0; i < allSpark.Length; i++) 
{ 
    ViewBag.Foo[i].Name = allSpark[i].Users.Name; 
    ... 
} 

ブレークポイントを設定してallSpark[i].Users.Nameを検査するときには、値(例: "フレッド"など)があります。

このコード行をコメントアウトすると、次の行(同様のコード)は同じ例外をスローします。

したがって、問題はallSpark[i].Users.Nameがヌル参照(私が確認したもの)であるか、私のようにViewBagを使用できないことです。後者の場合は、ViewBagをこの方法で使用できると思ったので、私は混乱しています。

+1

allSparkおよびViewBagインスタンスの作成に関するコードをいくつか追加できますか? – janhartmann

+1

Foo [i]はどうですか?おそらくそれはnullです – Beatles1692

+0

Foo [i]はわかっていなければなりません – kommradHomer

答えて

10

ルック:

ViewBag.Foo = new myDataModelType[allSpark.Length]; 
for (int i = 0; i < allSpark.Length; i++) 
{ 
    ViewBag.Foo[i].Name = ... 
    ... 
} 

ViewBag.Fooが初期化されるが、ViewBag.Fooの各要素myDataModelTypeがクラスであると仮定すると、nullあろう。配列を作成すると、各要素は要素型の既定値に初期化されます。参照型の場合、既定値はnullです。

あなたは各要素の新しいオブジェクトを作成する必要があります。

for (int i = 0; i < allSpark.Length; i++) 
{ 
    ViewBag.Foo[i] = new myDataModelType(); 
    ViewBag.Foo[i].Name = ... 
    ... 
} 
+0

+1もちろん、 'ViewBag.Foo [i] = new myDataModelType {Name = ...、Bar = ...}; '。また、アイテムに対してより複雑な操作を行う場合、 'var item = new myDataModelType(); // itemに対する操作。 ViewBag.Foo [i] = item; 'インデックスを繰り返し配列に保存します。 –

+0

@AdamRalph:確かに - 私はその時点で最小限の変更をしたいと思っていましたが、それはすべて考慮すべき良いことです。 –

+0

ありがとう!私はそれを見落としたとは信じられません。 – TMC

1

allSpark[i].Users.Nameに値がある場合は、左側のプロパティを参照している可能性があります。

ViewBag.Fooが存在するかどうかを確認し、位置iに存在するかどうかを確認します。

+0

+1しかし、少し良い言葉にされている可能性があります –

1

いずれViewBagがnullであり、したがって.fooという[i]は 存在しないか、fooがヌルとインデックスであり、有効な 又はフーない[i]がヌルであるため、Fooの[I] .nameのが有効

ありませんこのコードで
+0

+1私の答えと同じ結論:) –

0

あなたはそれに名前を割り当てる前にViewBag.Foo [I]のインスタンスを作成する必要があります。

ViewBag.Foo = new myDataModelType[allSpark.Length]; 
for (int i = 0; i < allSpark.Length; i++) 
{ 

ViewBag.Foo[i] = new ObjectThatHasNameProperty(); 
    ViewBag.Foo[i].Name = allSpark[i].Users.Name; 

} 

allSpark[i].Users.Name値を持っていますが、例外は、このようにViewBag.Foo[i]ません。

関連する問題