diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 7b8d4ef91..6a0a7d2f3 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -325,8 +325,15 @@ namespace ICSharpCode.Decompiler.CSharp internal ExpressionWithResolveResult GetDefaultValueExpression(IType type) { - var expr = type.IsReferenceType == true ? (Expression)new NullReferenceExpression() : new DefaultValueExpression(ConvertType(type)); - var constantType = type.IsReferenceType == true ? SpecialType.NullType : type; + Expression expr; + IType constantType; + if (type.IsReferenceType == true || type.IsKnownType(KnownTypeCode.NullableOfT)) { + expr = new NullReferenceExpression(); + constantType = SpecialType.NullType; + } else { + expr = new DefaultValueExpression(ConvertType(type)); + constantType = type; + } return expr.WithRR(new ConstantResolveResult(constantType, null)); } diff --git a/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs b/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs index 3c1c86d84..34075fa46 100644 --- a/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs +++ b/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs @@ -173,16 +173,26 @@ namespace ICSharpCode.Decompiler.CSharp var type = this.Type; if (type.Equals(targetType)) { // Make explicit conversion implicit, if possible - if (allowImplicitConversion && ResolveResult is ConversionResolveResult conversion) { - if (Expression is CastExpression cast - && (type.IsKnownType(KnownTypeCode.Object) && conversion.Conversion.IsBoxingConversion - || type.Kind == TypeKind.Delegate && conversion.Conversion.IsAnonymousFunctionConversion - )) { - return this.UnwrapChild(cast.Expression); - } else if (Expression is ObjectCreateExpression oce && conversion.Conversion.IsMethodGroupConversion - && oce.Arguments.Count == 1 && expressionBuilder.settings.UseImplicitMethodGroupConversion) - { - return this.UnwrapChild(oce.Arguments.Single()); + if (allowImplicitConversion) { + switch (ResolveResult) { + case ConversionResolveResult conversion: { + if (Expression is CastExpression cast + && (type.IsKnownType(KnownTypeCode.Object) && conversion.Conversion.IsBoxingConversion + || type.Kind == TypeKind.Delegate && conversion.Conversion.IsAnonymousFunctionConversion + )) { + return this.UnwrapChild(cast.Expression); + } else if (Expression is ObjectCreateExpression oce && conversion.Conversion.IsMethodGroupConversion + && oce.Arguments.Count == 1 && expressionBuilder.settings.UseImplicitMethodGroupConversion) { + return this.UnwrapChild(oce.Arguments.Single()); + } + break; + } + case InvocationResolveResult invocation: { + if (Expression is ObjectCreateExpression oce && oce.Arguments.Count == 1 && invocation.Type.IsKnownType(KnownTypeCode.NullableOfT)) { + return this.UnwrapChild(oce.Arguments.Single()); + } + break; + } } } return this;