Browse Source

Fix #3384: add special case for null-literal conversions in optional argument handling.

pull/3403/head
Siegfried Pammer 3 months ago
parent
commit
d7d0f82418
  1. 22
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/OptionalArguments.cs
  2. 5
      ICSharpCode.Decompiler/CSharp/CallBuilder.cs

22
ICSharpCode.Decompiler.Tests/TestCases/Pretty/OptionalArguments.cs

@ -32,6 +32,28 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
B B
} }
internal class OptionalArgumentTest
{
private static void Test()
{
Test2();
Test3();
Test4();
}
private static void Test2(int a = 0)
{
}
private static void Test3(int a = 0, int? b = null)
{
}
private static void Test4(int? b = null, int a = 0)
{
}
}
public OptionalArguments(string name, int a = 5) public OptionalArguments(string name, int a = 5)
{ {

5
ICSharpCode.Decompiler/CSharp/CallBuilder.cs

@ -1043,7 +1043,10 @@ namespace ICSharpCode.Decompiler.CSharp
bool IsOptionalArgument(IParameter parameter, TranslatedExpression arg) bool IsOptionalArgument(IParameter parameter, TranslatedExpression arg)
{ {
if (!parameter.IsOptional || !arg.ResolveResult.IsCompileTimeConstant) if (!parameter.IsOptional)
return false;
if (!arg.ResolveResult.IsCompileTimeConstant && arg.ResolveResult is not ConversionResolveResult { Conversion.IsNullLiteralConversion: true })
return false; return false;
if (parameter.GetAttributes().Any(a => a.AttributeType.IsKnownType(KnownAttribute.CallerMemberName) if (parameter.GetAttributes().Any(a => a.AttributeType.IsKnownType(KnownAttribute.CallerMemberName)
|| a.AttributeType.IsKnownType(KnownAttribute.CallerFilePath) || a.AttributeType.IsKnownType(KnownAttribute.CallerFilePath)

Loading…
Cancel
Save