Apply UnknownDerivedTypeHandling.Fail to tag-based polymorphism#133
Merged
Conversation
Previously, UnknownDerivedTypeHandling.Fail only applied to property-based discriminators. Unknown tags in tag-based polymorphism were silently ignored, falling through to the base type. This made it impossible to detect configuration errors when using tag-based type discrimination. This change applies the same Fail/FallBackToBase logic to the tag lookup path in both the reflection-based converter and the source generator. A new ThrowUnknownTypeTag helper is added to YamlThrowHelper for consistent error messages that include the unrecognized tag value.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
When using tag-based polymorphism with
UnknownDerivedTypeHandling.Fail, unknown property discriminators correctly throw aYamlException. However, unknown YAML tags are silently ignored — the deserializer falls through to the base type without any error.This inconsistency makes it impossible to detect configuration errors when using tag-based type discrimination (e.g.,
!http,!ping,!tcptags). A typo in a tag silently produces a base-type instance instead of failing fast.Example
Solution
Apply the same
Fail/FallBackToBaselogic to the tag lookup path, consistent with how property-based discriminators already work:YamlObjectConverter.ReadPolymorphic()— After the tag lookup fails, checkDefaultDerivedTypefirst, then checkUnknownDerivedTypeHandling == Failand throw.ifchain in the generatedReadValuemethods.YamlThrowHelper.ThrowUnknownTypeTag()— New helper for tag-specific error messages (e.g.,\"Unknown type tag '!lizard' for 'Animal'\").Tests
10 new tests covering:
DerivedTypeMappings