0

コレクションをモックアップして列挙しようとすると、理解できない奇妙な NullReferenceException が発生します。Mock が原因だとは思いませんが、100% 確信はありません。私がやっているばかげたことを誰か特定できますか?

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
}

このコード行のスタック トレースは次のとおりです。

System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンス
に設定されていません。結果 StackTrace:
CMS.SettingsProvider.ObjectDataSet 1.GetObjectEnumerator() at CMS.SettingsProvider.InfoDataSet`1.d__0.MoveNext() at ...1.GetEnumerator() at
CMS.SettingsProvider.ObjectDataSet


コレクションの内容は、単に 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;
    }

Values には単一の値が含まれており、ウォッチ ウィンドウを介して細かく列挙できます...

ここに画像の説明を入力

ここで私が間違っていることを誰かが説明できますか?

4

2 に答える 2

1

これは、下の CMS (Kentico) に部分的にかかっていると思うのは少し奇妙です。以前、 Unable to call ToArray() on third party class に関する質問を投稿した問題に遭遇しましたが、これが同じ影響を及ぼしている可能性があることに気付きました。

の結果はInfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);、コンパイラが の型を判別するのが難しいようです。したがって、キャストが下で発生していると思います

((IEnumerable<OrderItemInfo>)orders)

これが失敗しているため、IEnumerable が null になるため、NullReferenceException が発生すると思います。解決策は、各アイテムの単純なキャストです。

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach (OrderItemInfo orderItem in orders.Cast<OrderItemInfo>())
{
   // Now works
}
于 2013-11-25T17:26:23.393 に答える