为什么“;空引用”;当变量有值时报告
本文关键字:变量 报告 引用 为什么 | 更新日期: 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]
因此没有例外。