文煌 5 years ago
parent
commit
581a1de185
  1. 23
      ICSharpCode.Decompiler/IL/Transforms/TransformExpressionTrees.cs

23
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);
}

Loading…
Cancel
Save