diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformExpressionTrees.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformExpressionTrees.cs index f50e00026..29d4b2f39 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformExpressionTrees.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/TransformExpressionTrees.cs @@ -515,15 +515,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms Arguments = { left(), right() } }, method.ReturnType); case 4: - if (!invocation.Arguments[2].MatchLdcI4(out var isLifted)) + if (!invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull)) return (null, SpecialType.UnknownType); if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method)) return (null, SpecialType.UnknownType); - if (isLifted != 0) + bool isLifted = NullableType.IsNullable(leftType); + if (isLifted) method = CSharpOperators.LiftUserDefinedOperator((IMethod)method); return (() => new Call((IMethod)method) { Arguments = { left(), right() } - }, method.ReturnType); + }, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType); default: return (null, SpecialType.UnknownType); } @@ -729,13 +730,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms var (right, rightType) = ConvertInstruction(invocation.Arguments[1]); if (right == null) return (null, SpecialType.UnknownType); - if (invocation.Arguments.Count == 4 && invocation.Arguments[2].MatchLdcI4(out var isLifted) && MatchGetMethodFromHandle(invocation.Arguments[3], out var method)) + if (invocation.Arguments.Count == 4 && invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull) && MatchGetMethodFromHandle(invocation.Arguments[3], out var method)) { - if (isLifted != 0) - { + bool isLifted = NullableType.IsNullable(leftType); + if (isLifted) method = CSharpOperators.LiftUserDefinedOperator((IMethod)method); - } - return (() => new Call((IMethod)method) { Arguments = { left(), right() } }, method.ReturnType); + return (() => new Call((IMethod)method) { Arguments = { left(), right() } }, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType); } var rr = resolver.ResolveBinaryOperator(kind.ToBinaryOperatorType(), new ResolveResult(leftType), new ResolveResult(rightType)) as OperatorResolveResult; if (rr != null && !rr.IsError && rr.UserDefinedOperatorMethod != null) @@ -979,15 +979,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms Arguments = { left(), right() } }, method.ReturnType); case 4: - if (!invocation.Arguments[2].MatchLdcI4(out var isLifted)) + if (!invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull)) return (null, SpecialType.UnknownType); if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method)) return (null, SpecialType.UnknownType); - if (isLifted != 0) + bool isLifted = NullableType.IsNullable(leftType); + if (isLifted) method = CSharpOperators.LiftUserDefinedOperator((IMethod)method); return (() => new Call((IMethod)method) { Arguments = { left(), right() } - }, method.ReturnType); + }, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType); default: return (null, SpecialType.UnknownType); }