为什么当变量有值时会报告“空引用”?

为什么当变量有值时会报告“空引用”?

问题描述:

我有一些C#代码,多数民众赞成抛出一个异常,声称我的ASP.NET MVC3项目:为什么当变量有值时会报告“空引用”?

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时,它肯定有一个值(例如“Fred”)。

如果我注释掉这行代码,下一行(类似的代码)会抛出相同的异常。

所以问题是要么allSpark[i].Users.Name是一个空引用(我已经证实不是)或者我不能像我一样使用ViewBag。如果是后者,我很困惑,因为我认为ViewBag可以这样使用。

+1

你能提供一些关于创建allSpark和ViewBag实例的代码吗? – janhartmann 2012-02-21 07:28:27

+1

Foo [i]怎么样?也许它是空的 – Beatles1692 2012-02-21 07:28:30

+0

Foo [i]必须为空,以我的理解 – kommradHomer 2012-02-21 07:29:23

看看这个代码:

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

ViewBag.Foo被初始化,但每个元件的ViewBag.Foonull,假设myDataModelType是一类。在创建数组时,每个元素都被初始化为元素类型的默认值 - 对于引用类型,该默认值为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(); //对项目的操作; ViewBag.Foo [i] = item;'反复保存索引到数组中。 – 2012-02-21 07:44:11

+0

@AdamRalph:当然 - 我想保持最小的变化,但这些都是好事情要考虑:) – 2012-02-21 07:51:35

+0

谢谢!我不敢相信我忽略了这一点。 – TMC 2012-02-21 08:19:44

如果allSpark[i].Users.Name包含一个值,那么它可能是引用左侧的属性。

检查ViewBag.Foo是否存在,然后如果它存在于位置i。

+0

+1,但可能已经措辞好一点 – 2012-02-21 07:45:57

要么ViewBag为空,因此包含.foo [I]不存在 或富为空和索引它是无效 或富[i]是零,因此富[I]请将.Name无效

+0

+1与我的回答相同的结论:) – 2012-02-21 07:40:13

您必须[I]为其分配名称之前创建ViewBag.Foo的一个实例。

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]不例外。