【问题标题】:Why is a "null reference" being reported when variable has a value?为什么当变量有值时会报告“空引用”?
【发布时间】:2012-02-21 07:26:13
【问题描述】:

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

【问题讨论】:

  • 您能否提供更多有关创建 allSpark 和 ViewBag 实例的代码?
  • Foo[i] 怎么样?也许它是空的
  • Foo[i] 必须为 null ,据我了解
  • Users 是一个集合还是一个变量?您可以发布您的 foreach 代码吗?
  • +1 for allspark。汽车人,推出

标签: c# asp.net


【解决方案1】:

看看这段代码:

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(); // operations on item; ViewBag.Foo[i] = item; 将重复索引保存到数组中。
  • @AdamRalph:当然 - 我想暂时保持最小的变化,但这些都是值得考虑的好事情:)
  • 谢谢!我不敢相信我忽略了这一点。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您必须先创建 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] 没有因此异常。

      【讨论】:

        猜你喜欢
        • 2023-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-15
        • 2013-02-23
        • 1970-01-01
        • 2013-12-29
        • 2015-01-07
        相关资源
        最近更新 更多