-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Closed
Labels
area-Extensions-Configurationsource-generatorIndicates an issue with a source generator featureIndicates an issue with a source generator feature
Milestone
Description
Description
When binding to a type with a constructor that has a default string parameter, the generator emits code that doesn't compile.
C:\scratch\configStringCtorParam\Microsoft.Extensions.Configuration.Binder.SourceGeneration\Microsoft.Extensions.Config
uration.Binder.SourceGeneration.ConfigurationBindingGenerator\BindingExtensions.g.cs(77,27): error CS0103: The name 's'
does not exist in the current context [C:\scratch\configStringCtorParam\configStringCtorParam.csproj]
The code generated looks like this:
public static SD InitializeSD(IConfiguration configuration, BinderOptions? binderOptions)
{
if (configuration["S"] is string value1)
{
string s = value1;
}
return new SD(s);
}Bug is likely in the EmitBindImplForMember method but I haven't tracked it down. I suspect there's a disagreement between the case where the member is string parseable but also has a default value. This same repro works when removing the default value.
Reproduction Steps
using Microsoft.Extensions.Configuration;
var c = new ConfigurationBuilder().Build();
var x = c.Get<SD>();
Console.WriteLine(x);
public class SD
{
public SD(string s = "default value") { S = s; }
public string S { get;}
public override string ToString() => S;
}Expected behavior
Compiles successfully.
Actual behavior
Compilation failure.
Regression?
No
Known Workarounds
Remove default value from ctor param.
Configuration
No response
Other information
No response
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area-Extensions-Configurationsource-generatorIndicates an issue with a source generator featureIndicates an issue with a source generator feature