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

本文关键字:变量 报告 引用 为什么 | 更新日期: 2023-09-27 18:25:12

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

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

看看这个代码:

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

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

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

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

ViewBag为null,因此.Foo[i]不存在或者Foo为null,并且对其进行索引无效或者Foo[i]为null,因此Foo[i].Name无效

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

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

在为ViewBag.Foo[i]指定Name之前,必须创建一个实例。

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]因此没有例外。