C# 尝试通过模拟枚举时出现NullReferenceException
我遇到了一个奇怪的NullReferenceException,在尝试模拟要枚举的集合时,我无法理解它。我不认为这是由Mock引起的,但我不是100%确定。有人能认出我在做什么傻事吗C# 尝试通过模拟枚举时出现NullReferenceException,c#,unit-testing,kentico,justmock,C#,Unit Testing,Kentico,Justmock,我遇到了一个奇怪的NullReferenceException,在尝试模拟要枚举的集合时,我无法理解它。我不认为这是由Mock引起的,但我不是100%确定。有人能认出我在做什么傻事吗 InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID); foreach (OrderItemInfo orderItem in orders) { // Excepti
InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach (OrderItemInfo orderItem in orders)
{
// Exception thrown on the first attempt to get an OrderItem in the foreach
}
InfoDataSet orders=OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach(订单中的OrderItemInfo orderItem)
{
//首次尝试在foreach中获取OrderItem时引发异常
}
这行代码的堆栈跟踪如下所示:
System.NullReferenceException:对象引用未设置为实例指一个物体。结果StackTrace:at
CMS.SettingsProvider.ObjectDataSet
1.GetEnumerator()位于
CMS.SettingsProvider.ObjectDataSet
1.GetObjectEnumerator()位于CMS.SettingsProvider.InfoDataSet`1.d_u0.MoveNext()
在 集合的内容只是IEnumerable的包装。在我的情况下,这应该给你一个关于发生了什么的想法。GetEnumerator(隐式和非隐式)实现只是调用值
private IEnumerable<T> values;
/// <summary>
/// Initializes a new instance of the <see cref="MockDataSet{T}"/> class.
/// </summary>
/// <param name="values">The values.</param>
public MockDataSet(IEnumerable<T> values)
{
if (values == null)
throw new ArgumentNullException("values");
this.values = values;
}
私有IEnumerable值;
///
///初始化类的新实例。
///
///价值观。
公共MockDataSet(IEnumerable值)
{
如果(值==null)
抛出新的ArgumentNullException(“值”);
这个值=值;
}
值中只有一个值,我可以通过watch窗口很好地枚举它
谁能解释一下我做错了什么吗?
orders
为空。您认为这不是因为循环已经启动,而是因为这是一个惰性的过程
像这样更改代码,它不会失败:
InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
if (orders != null)
{
foreach (OrderItemInfo orderItem in orders)
{
// Exception thrown on the first attempt to get an OrderItem in the foreach
}
}
InfoDataSet orders=OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
如果(订单!=null)
{
foreach(订单中的OrderItemInfo orderItem)
{
//首次尝试在foreach中获取OrderItem时引发异常
}
}
还请记住,每当您在调试器中查看某个内容时,很长一段时间都是以周期的形式过去的——如果您有任何异步更新,它可能还没有完成。这有点奇怪,我认为这部分是由于下面的CMS(Kentico)。早些时候我遇到了一个问题,我在上面贴了一个问题,我刚刚意识到这可能会产生同样的影响 似乎
InfoDataSet orders=OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID)的结果代码>对于编译器来说很难确定类型。因此,我认为演员阵容正在形成
((IEnumerable)订单)
我认为这是失败的,导致IEnumerable为null,从而导致NullReferenceException。解决方案是对每个项目的简单转换:
InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach (OrderItemInfo orderItem in orders.Cast<OrderItemInfo>())
{
// Now works
}
InfoDataSet orders=OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach(orders.Cast()中的OrderItemInfo orderItem)
{
//现在起作用了
}
恐怕订单不是空的。。。如表中所示,它已填充。我尝试了空引用检查,但以完全相同的方式失败(请注意,我在运行测试之前卸下了手表)。@Ian-Oh,如果你发布了一张图片,我看不到它。(防火墙)。你有和上面一样的代码吗?第一次尝试使用orderItem是什么样子的?Hogan-即将发布关于为什么的答案。对不起,是的,我确实包括了一个image@lan为什么不在foreach中显示一些代码呢。这会给我们更多的思考。@Dinesh:我可以——尽管我从来没有像代码那样深入,而且它是特定领域的。我已经找到了问题所在。。。我将发布一个答案。