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

时间:2012-02-21 07:26:13

标签: c# asp.net

我的ASP.NET MVC3项目中有一些C#代码抛出了一个异常声明:

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可以这样使用。

4 个答案:

答案 0 :(得分:10)

看看这段代码:

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 :(得分:1)

如果allSpark[i].Users.Name包含值,则可能是左侧引用该属性。

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

答案 2 :(得分:1)

ViewBag为null,因此.Foo [i]不存在 或者Foo为null并且索引它无效 或者Foo [i]为空,因此Foo [i] .Name无效

答案 3 :(得分: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]不是例外。