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

TMC*_*TMC 1 c# asp.net

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

Cannot perform runtime binding on a null reference
Run Code Online (Sandbox Code Playgroud)

抛出异常的代码行是:

ViewBag.Foo[i].Name = allSpark[i].Users.Name;
Run Code Online (Sandbox Code Playgroud)

这是代码块:

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

当我设置断点并检查时allSpark[i].Users.Name,它肯定有一个值(例如"Fred").

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

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

Jon*_*eet 10

看看这段代码:

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

ViewBag.Foo被初始化,但是每个元件ViewBag.Foo将是null,假定myDataModelType是一个类.创建数组时,每个元素都初始化为元素类型的默认值 - 对于引用类型,该默认值为null.

您需要为每个元素创建一个新对象:

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