stride3d/stride · error · ArgumentException

List cannot contain null items

Error message

List cannot contain null items

What it means

Input validation in AssetCollision.Clean: one of the inputItems/outputItems collections contains a null AssetItem element. The loop over the collections hit a null entry, which the collision-resolution algorithm cannot process.

Solutions

  1. Remove null entries from inputItems/outputItems before calling Clean
  2. Fix the upstream code producing null AssetItems in the collections
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at sources/assets/Stride.Core.Assets/Analysis/AssetCollision.cs:39 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/2d0b831758288c98. Report an issue: GitHub.

Appendix: source

Thrown at sources/assets/Stride.Core.Assets/Analysis/AssetCollision.cs:39

    /// <param name="removeUnloadableObjects">If set to <c>true</c>, assets will be cloned with <see cref="AssetClonerFlags.RemoveUnloadableObjects"/>.</param>
    /// <exception cref="ArgumentNullException">
    /// inputItems
    /// or
    /// outputItems
    /// or
    /// assetResolver
    /// </exception>
    /// <exception cref="System.ArgumentException">List cannot contain null items;inputItems</exception>
    public static void Clean(Package package, ICollection<AssetItem> inputItems, ICollection<AssetItem> outputItems, AssetResolver assetResolver, bool cloneInput, bool removeUnloadableObjects)
    {
        ArgumentNullException.ThrowIfNull(inputItems);
        ArgumentNullException.ThrowIfNull(outputItems);
        ArgumentNullException.ThrowIfNull(assetResolver);

        // Check that all items are non-null
        if (inputItems.Any(item => item == null))
        {
            throw new ArgumentException("List cannot contain null items", nameof(inputItems));
        }

        var items = inputItems;
        if (cloneInput)
        {
            items = inputItems.Select(item => item.Clone(flags: removeUnloadableObjects ? AssetClonerFlags.RemoveUnloadableObjects : AssetClonerFlags.None)).ToList();
        }

        // idRemap should contain only assets that have either 1) their id remapped or 2) their location remapped
        var idRemap = new Dictionary<AssetId, Tuple<AssetId, UFile>>();
        var itemRemap = new Dictionary<AssetItem, Tuple<AssetId, UFile>>();
        foreach (var item in items)
        {
            if (outputItems.Contains(item))
            {
                continue;
            }

View on GitHub (pinned to 96fad776d2)