diff --git a/src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Emitter/CoreBindingHelpers.cs b/src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Emitter/CoreBindingHelpers.cs index ba4f4617d683b2..03345f3c47770f 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Emitter/CoreBindingHelpers.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Emitter/CoreBindingHelpers.cs @@ -746,7 +746,7 @@ private void EmitBindCoreImplForDictionary(DictionarySpec type) Emit_Foreach_Section_In_ConfigChildren_StartBlock(); ParsableFromStringSpec keyType = (ParsableFromStringSpec)_typeIndex.GetEffectiveTypeSpec(type.KeyTypeRef); - TypeSpec elementType = _typeIndex.GetTypeSpec(type.ElementTypeRef); + TypeSpec elementType = _typeIndex.GetEffectiveTypeSpec(type.ElementTypeRef); // Parse key EmitBindingLogic( diff --git a/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs b/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs index 96be1fa6c41642..66d91cc0655304 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs @@ -1131,5 +1131,21 @@ public class ParsableValuesClass public Guid? GuidValue { get; set; } public StringComparison? StringComparisonValue { get; set; } } + + public class OptionsWithCollectionsWithNullableEnum + { + // uses MyValue? dictionary values + public Dictionary Dictionary { get; set; } = new(); + + // uses MyValue? List values + public List List { get; set; } = new(); + } + + public enum MyValue + { + Value1, + Value2, + Value3 + } } } diff --git a/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.cs b/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.cs index 95be3ecb5251d2..f949ea10dc87e5 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.cs @@ -2816,6 +2816,29 @@ public void CanGetEnumerableNotCollection() Assert.Equal(new [] { "new", "class", "rosebud"}, result.Keywords); } + [Fact] + public void TestDictionaryWithNullableEnumValueType() + { + var builder = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary + { + { "Settings:Dictionary:Key1", "Value2" }, + { "Settings:List:1", "Value3" }, + }); + var config = builder.Build(); + + var settingsSection = config.GetSection("Settings"); + OptionsWithCollectionsWithNullableEnum settings = settingsSection.Get()!; + + Assert.NotNull(settings.Dictionary); + Assert.Equal(1, settings.Dictionary.Count); + Assert.Equal(MyValue.Value2, settings.Dictionary["Key1"]); + + Assert.NotNull(settings.List); + Assert.Equal(1, settings.List.Count); + Assert.Equal(MyValue.Value3, settings.List[0]); + } + #if !BUILDING_SOURCE_GENERATOR_TESTS [Fact] public void EnsureThrowingWithCollectionAndErrorOnUnknownConfigurationOption()