{"record":{"id":"ca961f14b44a2299","repo":"dotnet/BenchmarkDotNet","slug":"there-is-no-default-resolver-for-characteristic-f-ca961f","errorCode":null,"errorMessage":"There is no default resolver for {characteristic.FullId}","messagePattern":"There is no default resolver for (.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/BenchmarkDotNet/Characteristics/Resolver.cs","lineNumber":24,"sourceCode":"    {\n        private readonly Dictionary<Characteristic, Func<CharacteristicObject, object?>> resolvers = [];\n\n        protected void Register<[DynamicallyAccessedMembers(CharacteristicObject.CharacteristicMemberTypes)] T>(Characteristic<T> characteristic, Func<T?> resolver) =>\n            resolvers[characteristic] = obj => resolver();\n\n        protected void Register<[DynamicallyAccessedMembers(CharacteristicObject.CharacteristicMemberTypes)] T>(Characteristic<T> characteristic, Func<CharacteristicObject, T?> resolver) =>\n            resolvers[characteristic] = obj => resolver(obj);\n\n        public bool CanResolve(Characteristic characteristic) => resolvers.ContainsKey(characteristic);\n\n        public object? Resolve(CharacteristicObject obj, Characteristic characteristic)\n        {\n            if (obj.HasValue(characteristic))\n                return characteristic[obj];\n\n            if (resolvers.TryGetValue(characteristic, out var resolver))\n                return resolver(obj);\n            throw new InvalidOperationException($\"There is no default resolver for {characteristic.FullId}\");\n        }\n\n        public T? Resolve<[DynamicallyAccessedMembers(CharacteristicObject.CharacteristicMemberTypes)] T>(CharacteristicObject obj, Characteristic<T> characteristic)\n        {\n            if (obj.HasValue(characteristic))\n                return characteristic[obj];\n\n            if (resolvers.TryGetValue(characteristic, out var resolver))\n                return (T?)resolver(obj);\n            throw new InvalidOperationException($\"There is no default resolver for {characteristic.FullId}\");\n        }\n\n        public object? Resolve(CharacteristicObject obj, Characteristic characteristic, object defaultValue)\n        {\n            if (obj.HasValue(characteristic))\n                return characteristic[obj];\n\n            if (resolvers.TryGetValue(characteristic, out var resolver))","sourceCodeStart":6,"sourceCodeEnd":42,"githubUrl":"https://github.com/dotnet/BenchmarkDotNet/blob/b515068b61ad1c9c9aa938b8ece4af1e7d6d85a3/src/BenchmarkDotNet/Characteristics/Resolver.cs#L6-L42","documentation":"The single Resolver class (base for resolvers like InfrastructureResolver) keeps a dictionary of characteristic->resolver-func registrations. The non-generic Resolve throws InvalidOperationException when resolvers.TryGetValue finds no entry for the requested characteristic, i.e. that specific Resolver instance never had Register(...) called for it.","triggerScenarios":"Calling Resolve on a Resolver for a characteristic it was not built to handle (asking the InfrastructureResolver for a runtime characteristic, for instance), or a custom Resolver subclass that forgot to register one of its characteristics.","commonSituations":"Subclassing Resolver and omitting a Register call, querying a characteristic against the wrong resolver instance, or a version mismatch where a characteristic exists but its resolver registration was removed.","solutions":["Register the characteristic in the resolver: resolver.Register(characteristic, obj => ...) inside its constructor.","Route the request through the CompositeResolver / correct specialized resolver that owns the characteristic.","Check resolver.CanResolve(characteristic) (which is resolvers.ContainsKey) before calling Resolve.","Set an explicit value on the object so the HasValue path is taken instead."],"exampleFix":"// before\nvar v = resolver.Resolve(obj, characteristic); // not registered\n\n// after\nif (resolver.CanResolve(characteristic))\n    var v = resolver.Resolve(obj, characteristic);\nelse\n    obj = obj.With(characteristic, fallback);","handlingStrategy":"validation","validationCode":"if (!resolver.CanResolve(characteristic))\n    throw new InvalidOperationException($\"Resolver '{resolver.GetType().Name}' cannot resolve '{characteristic.Id}'.\");\nreturn resolver.Resolve(obj, characteristic);","typeGuard":"bool ResolverOwns(Resolver r, Characteristic c) => r.CanResolve(c);","tryCatchPattern":"try { return resolver.Resolve(obj, characteristic); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"no default resolver\"))\n{\n    // route to the resolver that owns the characteristic, or register it\n}","preventionTips":["When subclassing Resolver, Register every characteristic the subclass owns in its constructor.","Query characteristics only through the resolver (or composite) that owns them.","Keep resolver registrations and characteristic definitions in sync across version upgrades."],"tags":["characteristics","resolver","registration","invalidoperation"],"backgroundTag":null,"analyzedSha":"b515068b61ad1c9c9aa938b8ece4af1e7d6d85a3","analyzedAt":"2026-08-13T19:12:24.196Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}