文煌 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() } Arguments = { left(), right() }
}, method.ReturnType); }, method.ReturnType);
case 4: case 4:
if (!invocation.Arguments[2].MatchLdcI4(out var isLifted)) if (!invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull))
return (null, SpecialType.UnknownType); return (null, SpecialType.UnknownType);
if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method)) if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method))
return (null, SpecialType.UnknownType); return (null, SpecialType.UnknownType);
if (isLifted != 0) bool isLifted = NullableType.IsNullable(leftType);
if (isLifted)
method = CSharpOperators.LiftUserDefinedOperator((IMethod)method); method = CSharpOperators.LiftUserDefinedOperator((IMethod)method);
return (() => new Call((IMethod)method) { return (() => new Call((IMethod)method) {
Arguments = { left(), right() } Arguments = { left(), right() }
}, method.ReturnType); }, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType);
default: default:
return (null, SpecialType.UnknownType); return (null, SpecialType.UnknownType);
} }
@ -729,13 +730,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms
var (right, rightType) = ConvertInstruction(invocation.Arguments[1]); var (right, rightType) = ConvertInstruction(invocation.Arguments[1]);
if (right == null) if (right == null)
return (null, SpecialType.UnknownType); 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); method = CSharpOperators.LiftUserDefinedOperator((IMethod)method);
} return (() => new Call((IMethod)method) { Arguments = { left(), right() } }, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType);
return (() => new Call((IMethod)method) { Arguments = { left(), right() } }, method.ReturnType);
} }
var rr = resolver.ResolveBinaryOperator(kind.ToBinaryOperatorType(), new ResolveResult(leftType), new ResolveResult(rightType)) as OperatorResolveResult; var rr = resolver.ResolveBinaryOperator(kind.ToBinaryOperatorType(), new ResolveResult(leftType), new ResolveResult(rightType)) as OperatorResolveResult;
if (rr != null && !rr.IsError && rr.UserDefinedOperatorMethod != null) if (rr != null && !rr.IsError && rr.UserDefinedOperatorMethod != null)
@ -979,15 +979,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms
Arguments = { left(), right() } Arguments = { left(), right() }
}, method.ReturnType); }, method.ReturnType);
case 4: case 4:
if (!invocation.Arguments[2].MatchLdcI4(out var isLifted)) if (!invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull))
return (null, SpecialType.UnknownType); return (null, SpecialType.UnknownType);
if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method)) if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method))
return (null, SpecialType.UnknownType); return (null, SpecialType.UnknownType);
if (isLifted != 0) bool isLifted = NullableType.IsNullable(leftType);
if (isLifted)
method = CSharpOperators.LiftUserDefinedOperator((IMethod)method); method = CSharpOperators.LiftUserDefinedOperator((IMethod)method);
return (() => new Call((IMethod)method) { return (() => new Call((IMethod)method) {
Arguments = { left(), right() } Arguments = { left(), right() }
}, method.ReturnType); }, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType);
default: default:
return (null, SpecialType.UnknownType); return (null, SpecialType.UnknownType);
} }

Loading…
Cancel
Save