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
- Remove null entries from inputItems/outputItems before calling Clean
- 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)