Browse Source

Add back check for anonymous types

pull/847/head
Siegfried Pammer 8 years ago
parent
commit
3a7b1d2516
  1. 8
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

8
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1144,14 +1144,16 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1144,14 +1144,16 @@ namespace ICSharpCode.Decompiler.CSharp
// If anything goes wrong, apply explicit casts to all arguments.
if (result == null) {
for (int i = 0; i < arguments.Length; i++) {
arguments[i] = arguments[i].ConvertTo(method.Parameters[i].Type, this);
if (!method.Parameters[i].Type.ContainsAnonymousType())
arguments[i] = arguments[i].ConvertTo(method.Parameters[i].Type, this);
}
} else {
var or = new OverloadResolution(resolver.Compilation, arguments.Select(a => a.ResolveResult).ToArray());
or.AddMethodLists(result.MethodsGroupedByDeclaringType.ToArray());
if (or.BestCandidateErrors != OverloadResolutionErrors.None || !IsAppropriateCallTarget(method, or.BestCandidate, inst.OpCode == OpCode.CallVirt)) {
for (int i = 0; i < arguments.Length; i++) {
arguments[i] = arguments[i].ConvertTo(method.Parameters[i].Type, this);
if (!method.Parameters[i].Type.ContainsAnonymousType())
arguments[i] = arguments[i].ConvertTo(method.Parameters[i].Type, this);
}
}
}
@ -1193,7 +1195,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1193,7 +1195,7 @@ namespace ICSharpCode.Decompiler.CSharp
methodName = method.ImplementedInterfaceMembers[0].Name;
}
var mre = new MemberReferenceExpression(targetExpr, methodName);
if (requireTypeArguments)
if (requireTypeArguments && !method.TypeArguments.Any(a => a.ContainsAnonymousType()))
mre.TypeArguments.AddRange(method.TypeArguments.Select(ConvertType));
var argumentExpressions = arguments.Select(arg => arg.Expression);
expr = new InvocationExpression(mre, argumentExpressions);

Loading…
Cancel
Save