{"record":{"id":"f7b34a6c9d1718a8","repo":"stride3d/stride","slug":"argumentnullexception-templates","errorCode":null,"errorMessage":"ArgumentNullException: templates","messagePattern":"ArgumentNullException: templates","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"sources/editor/Stride.Core.Assets.Editor/Components/AddAssets/AssetTemplatesViewModel.cs","lineNumber":20,"sourceCode":"// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Stride.Core.Assets.Editor.Components.TemplateDescriptions.ViewModels;\nusing Stride.Core.Assets.Templates;\nusing Stride.Core.Annotations;\nusing Stride.Core.Presentation.ViewModels;\n\nnamespace Stride.Core.Assets.Editor.Components.AddAssets\n{\n    public class AssetTemplatesViewModel : DispatcherViewModel\n    {\n        private KeyValuePair<TemplateDescriptionViewModel, int> selectedTemplates;\n\n        public AssetTemplatesViewModel([NotNull] IViewModelServiceProvider serviceProvider, [NotNull] IEnumerable<TemplateAssetDescription> templates)\n            : base(serviceProvider)\n        {\n            if (templates == null) throw new ArgumentNullException(nameof(templates));\n            var list = templates.Select(x => new KeyValuePair<TemplateDescriptionViewModel, int>(new TemplateDescriptionViewModel(serviceProvider, x), 0)).ToList();\n            list.Sort((x, y) => x.Key.Order.CompareTo(y.Key.Order));\n            Templates = list;\n        }\n\n        public AssetTemplatesViewModel([NotNull] IViewModelServiceProvider serviceProvider, int fileCount, [NotNull] IEnumerable<KeyValuePair<TemplateAssetDescription, int>> templates)\n            : base(serviceProvider)\n        {\n            if (templates == null) throw new ArgumentNullException(nameof(templates));\n            FileCount = fileCount;\n            var list = templates.Select(x => new KeyValuePair<TemplateDescriptionViewModel, int>(new TemplateDescriptionViewModel(serviceProvider, x.Key), x.Value)).ToList();\n            list.Sort((x, y) => x.Key.Order.CompareTo(y.Key.Order));\n            Templates = list;\n        }\n\n        [NotNull]\n        public IEnumerable<KeyValuePair<TemplateDescriptionViewModel, int>> Templates { get; }\n","sourceCodeStart":2,"sourceCodeEnd":38,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/editor/Stride.Core.Assets.Editor/Components/AddAssets/AssetTemplatesViewModel.cs#L2-L38","documentation":"The AssetTemplatesViewModel(IViewModelServiceProvider, IEnumerable<TemplateAssetDescription>) constructor requires a templates collection and throws ArgumentNullException when it is null. It then wraps each template in a TemplateDescriptionViewModel, sorted by Order.","triggerScenarios":"Constructing AssetTemplatesViewModel with serviceProvider valid but templates == null.","commonSituations":"Passing a template list loaded asynchronously that failed to load, or a LINQ result assigned later and left null.","solutions":["Pass a non-null collection (use Enumerable.Empty<TemplateAssetDescription>() when there are no templates)","Guard the caller: only construct the view model after the template list has loaded","Coalesce null to an empty sequence before constructing"],"exampleFix":"// before\nnew AssetTemplatesViewModel(serviceProvider, loadedTemplates);\n// after\nnew AssetTemplatesViewModel(serviceProvider, loadedTemplates ?? Enumerable.Empty<TemplateAssetDescription>());","handlingStrategy":"validation","validationCode":"if (templates == null) templates = Enumerable.Empty<TemplateAssetDescription>();\nvar vm = new AssetTemplatesViewModel(serviceProvider, templates);","typeGuard":"static bool HasTemplates([NotNullWhen(true)] IEnumerable<TemplateAssetDescription>? t) => t != null;","tryCatchPattern":"try { vm = new AssetTemplatesViewModel(sp, templates); } catch (ArgumentNullException) { vm = new AssetTemplatesViewModel(sp, Enumerable.Empty<TemplateAssetDescription>()); }","preventionTips":["Coalesce null collections to Enumerable.Empty before constructing view models","Only build the dialog after template loading completes successfully","Enable nullable reference type annotations on caller code"],"tags":["null-argument","viewmodel","constructor"],"backgroundTag":"null-argument","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}