为什么当变量有值时会报告“空引用”?
我有一些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可以这样使用。
看看这个代码:
ViewBag.Foo = new myDataModelType[allSpark.Length];
for (int i = 0; i < allSpark.Length; i++)
{
ViewBag.Foo[i].Name = ...
...
}
ViewBag.Foo
被初始化,但每个元件的ViewBag.Foo
将null
,假设myDataModelType
是一类。在创建数组时,每个元素都被初始化为元素类型的默认值 - 对于引用类型,该默认值为null。
您需要创建一个新的对象的每个元素:
for (int i = 0; i < allSpark.Length; i++)
{
ViewBag.Foo[i] = new myDataModelType();
ViewBag.Foo[i].Name = ...
...
}
+1或者,当然,'ViewBag.Foo [i] = new myDataModelType {Name = ...,Bar = ...};'。或者,如果对该项目执行更复杂的操作,'var item = new myDataModelType(); //对项目的操作; ViewBag.Foo [i] = item;'反复保存索引到数组中。 – 2012-02-21 07:44:11
@AdamRalph:当然 - 我想保持最小的变化,但这些都是好事情要考虑:) – 2012-02-21 07:51:35
谢谢!我不敢相信我忽略了这一点。 – TMC 2012-02-21 08:19:44
如果allSpark[i].Users.Name
包含一个值,那么它可能是引用左侧的属性。
检查ViewBag.Foo
是否存在,然后如果它存在于位置i。
+1,但可能已经措辞好一点 – 2012-02-21 07:45:57
要么ViewBag为空,因此包含.foo [I]不存在 或富为空和索引它是无效 或富[i]是零,因此富[I]请将.Name无效
+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]
不例外。
你能提供一些关于创建allSpark和ViewBag实例的代码吗? – janhartmann 2012-02-21 07:28:27
Foo [i]怎么样?也许它是空的 – Beatles1692 2012-02-21 07:28:30
Foo [i]必须为空,以我的理解 – kommradHomer 2012-02-21 07:29:23